Как ускорить обработку / запись одного сложного набора данных - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть одна функция, которая отправляет большой объем данных (миллиарды строк) и возвращает кортеж

Набор данных [(Seq [Data1], Seq [Data2], Seq [Data3])]

Этот результирующий набор данных содержит еще большее количество строк (по сравнению с входными данными)

val result: Dataset[ (Seq[Data1], Seq[Data2], Seq[Data3]) ] = process(file, spark)

Seq[Data1] = billions rows
Seq[Data2] = millions rows
Seq[Data3] = millions rows (less than Data2) 

Теперь мне нужно записать эти 3 последовательности в отдельные файлы avro.

Как это сделать эффективно?

В настоящее время я использую функцию flatmap для отделения следующих Seqs:

result.flatMap( row => row._1).write.mode(SaveMode.Append).avro(path1) //Data1
 result.flatMap( row => row._2).write.mode(SaveMode.Append).avro(path2) //Data2
 result.flatMap( row => row._3).write.mode(SaveMode.Append).avro(path3) //Data3

По времени обработки я вижу, что все 3 вызова flatMap и запись файла avro занимали одно и то жевремя.Таким образом, похоже, что функция процесса была вызвана 3 раза (для каждой плоской карты)

Как вызвать функцию процесса только один раз, а затем только фильтровать результаты?

Можно ли использовать кэширование?(набор данных содержит миллиарды строк)

result.cache ()

Что вы рекомендуете делать?

Примечание: я использую Spark версии 2.2, scala 2.11.8

1 Ответ

0 голосов
/ 16 февраля 2019

Вы можете попробовать кэшировать результат, и, если существует достаточно памяти, результат будет кэширован, в противном случае кэширование завершится ошибкой, и результат будет пересчитан.

...