الانضمام إلى البث لتوليد جميع أزواج الصفوف من نفس RDD الكبير دون تكرار

-1

بالنسبة لـ RDD واحد كبير بهيكل (مفتاح ، قيمة) ، أريد إنشاء جميع الصفوف (key1 ، key2 ، value1 ، value2) حيث لا يجب وجود نسخ مكررة أو أزواج ذاتية. وهي (key1، key2، value1، value2) و (key2، key1، value2، value1) تُعتبر مكررة.

في عالم SQL يمكن للمرء أن يؤدي شيئا مثل

SELECT A.key, B.key 
FROM TABLE1 as A CROSS JOIN TABLE1 as B
WHERE A.key < B.key

ولكن بالنسبة لمجموعة بيانات الشرارة الخاصة بي ، فإن الربط المشترك (الديكارتي) مكلف للغاية ولا يمكن حسابه.

كيف يمكنني إنشاء جميع الصفوف المطلوبة باستخدام وصلة بث وتطبيق الشرط الذي key1> key2؟

من حيث الكود ، افترض مجموعة RDD بعناصر من النوع (مفتاح ، قيمة):

val broadcastSet = spark.broadcast(set.collect().toMap)
val result = set.map { (k,v) => { **???** } }

اين ؟؟؟ هي طريقة للتكرار من خلال جميع القيم في مجموعة البث وتطبيق شرط الطلب key1> key2؟

يمكن لأي شخص أن تعطيني بعض الاقتراحات؟

1 إجابة

0

بشكل عام ، عندما تريد انبعاث سجلات أكثر أو أقل من تلك الموجودة في مجموعة ، فإنك تستخدم .flatMap() . يجب أن يعمل شيء مثل هذا (الرمز غير المختبر):

val result = set.flatMap { (k1,v1) => {
  broadcastSet.value.flatMap { (k2,v2) => {
    if (k1 > k2) {
      Some(k1, k2, v1, v2)
    } else {
      None
    }
  }}
}}

هذا النمط ، سواء .flatMap() أو .map() ، يُعتبر "رابطًا على جانب الخريطة" ، ويمكن أن يكون وسيلة فعالة لتقليل التحميل العشوائي الذي سيتم تصفيته لاحقًا على أي حال.

:مؤلف
فوق
قائمة طعام