У меня есть два кадра данных, которые необходимо перекрестно соединить в кластере из 20 узлов. Однако из-за их размера простое перекрестное соединение не работает. Я хочу разделить данные и выполнить перекрестное соединение, и я ищу эффективный способ сделать это.
Вручную разбить файл f1 на три части и прочитать в фреймы данных: df1A, df1B, df1C
.
Вручную разбить файл f2 на четыре части и подготовить к кадрам данных: df2A, df2B, df2C, df2D
.
Перекрестное соединение df1A X df2A, df1A X df2B,..,df1A X df2D,...,df1C X df2D
.
Сохраняйте каждое перекрестное соединение в файл и вручную собирайте все файлы.
Таким образом, Spark может выполнять каждое перекрестное соединение параллельно, и все должно выполняться довольно быстро.
Есть ли более эффективный способ сделать это, прочитав оба файла в два фрейма данных, затем разбив каждый фрейм данных на 3 и 4 «части» и для каждого раздела одного фрейма данных перекрестное соединение с каждым разделом другого фрейма данных?
Фрейм данных может быть разделен эфирным диапазоном или хешем.
val df1 = spark.read.csv("file1.txt")
val df2 = spark.read.csv("file2.txt")
val partitionedByRange1 = df1.repartitionByRange(3, $"k")
val partitionedByRange2 = df2.repartitionByRange(4, $"k")
val result =partitionedByRange1.crossJoin(partitionedByRange2);
ПРИМЕЧАНИЕ. Установите свойство spark.sql.crossJoin.enabled=true.
Вы можете преобразовать это в rdd, а затем использовать декартову операцию на этом RDD. Затем вы сможете сохранить этот RDD в файл. надеюсь, это поможет
Как мне получить доступ к каждому разделу, чтобы я мог зацикливаться на каждом разделе?