У меня есть одна функция, которая отправляет большой объем данных (миллиарды строк) и возвращает кортеж
Набор данных [(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