Самостоятельное соединение больших фреймов данных

#apache-spark #apache-spark-sql #self-join #apache-spark-dataset

Вопрос:

Рассмотрим большой фрейм данных (~ 800 ГБ, 300 миллионов строк).

  --- ----- --- ----- --- ----- 
|C1 | C2  |C3 | C4  |C5 | C6  |
 --- ----- --- ----- --- ----- 
 

Я хочу соединить фрейм данных с самим собой (по столбцам C1 и C2)

 val srcDF = spark.read.orc("...")
val secondDF = srcDF.select(
        'C1 as "C1_t",
        'C2 as "C2_t",
        'C3 as "C3_t",
        'C4 as "C4_t", 
        'C5 as "C5_t",
        'C6 as "C6_t"
      )

val resultDF = srcDF.join(secondDF, srcDF("C1") === secondDF("C1_t") amp;amp; srcDF("C2") === secondDF("C2_t"))

 

У меня ошибка «не удалось максимально допустимое количество раз: 4. Последняя причина сбоя: org.apache.spark.shuffle.Исключение MetadataFetchFailedException: Отсутствует место вывода для случайного перебора»

Я пробовал bucketBy и разбиение по столбцам (C1, C2), ничего не помогает.

Есть какие-нибудь идеи?

Комментарии:

1. Зачем присоединяться к столу самому по себе? Вы хотели сделать что-то, чего могла бы достичь группа?

2. @JasonChia, я этого не делал. Я должен присоединиться сам по себе. например, мне нужны C5 и C5_t для некоторых преобразований и сравнения

3. Не могли бы вы проверить, достаточно ли места на ваших рабочих узлах? Назначенная память, размер одного раздела и т.д. Некоторая документация по этому исключению, связанная с пространством памяти подкачки. Если возможно, включите настройку spark.