Фрейм данных Spark Scala для больших перекрестных объединений - PullRequest
0 голосов
/ 11 марта 2019

У меня есть два кадра данных, которые необходимо соединить в кластере из 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 "части" и для каждого раздела одного перекрестного соединения одного кадра данных с каждым разделом другого кадра данных?

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Вы можете преобразовать это в rdd и затем использовать декартову операцию на этом RDD.После этого вы сможете сохранить этот RDD в файл.Надеюсь, это поможет

0 голосов
/ 11 марта 2019

Фрейм данных может быть разделен на диапазон эфира или хэш.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...