我有一个函数可以抛出大量数据(数十亿行)并返回元组
数据集[(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文件中。
如何有效地做到这一点?
目前,我使用平面地图功能来分隔这些序列:
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
从处理时间来看,flatMap和写入avro文件的所有3次调用都花费了相同的时间。 因此,似乎过程函数已被调用3次(每个平面图)
如何仅调用过程函数一次,然后仅过滤结果?
是否可以使用缓存? (数据集包含数十亿行)
result.cache()
您建议做什么?
注意:我使用的是Spark 2.2,scala 2.11.8
答案 0 :(得分:0)
您可以尝试缓存结果,如果有足够的内存将缓存结果,否则缓存将失败并且结果将重新计算。