У меня есть два больших набора данных, A и B, к которым я должен присоединиться sh по ключу K.
Каждый набор данных содержит много строк с одинаковым значением K, так что это множество для -мани объединение.
Это объединение завершается ошибкой с ошибками, связанными с памятью, если я просто наивно пытаюсь это сделать.
Давайте также скажем, группирование обоих наборов данных по K, выполнение объединения, а затем повторение с некоторыми хитростями получить правильный результат нереально, опять же из-за проблем с памятью
Были ли найдены какие-нибудь хитрые уловки, которые повышают вероятность этой работы?
Обновление:
Добавление очень, очень надуманного конкретного примера:
spark-shell --master local[4] --driver-memory 5G --conf spark.sql.autoBroadcastJoinThreshold=-1 --conf spark.sql.autoBroadcastJoinThreshold=-1 --conf spark.sql.shuffle.partitions=10000 --conf spark.default.parallelism=10000
val numbersA = (1 to 100000).toList.toDS
val numbersWithDataA = numbersA.repartition(10000).map(n => (n, 1, Array.fill[Byte](1000*1000)(0)))
numbersWithDataA.write.mode("overwrite").parquet("numbersWithDataA.parquet")
val numbersB = (1 to 100).toList.toDS
val numbersWithDataB = numbersB.repartition(100).map(n => (n, 1, Array.fill[Byte](1000*1000)(0)))
numbersWithDataB.write.mode("overwrite").parquet("numbersWithDataB.parquet")
val numbersWithDataInA = spark.read.parquet("numbersWithDataA.parquet").toDF("numberA", "one", "dataA")
val numbersWithDataInB = spark.read.parquet("numbersWithDataB.parquet").toDF("numberB", "one", "dataB")
numbersWithDataInA.join(numbersWithDataInB, Seq("one")).write.mode("overwrite").parquet("joined.parquet")
Неудача с Caused by: java.lang.OutOfMemoryError: Java heap space