Apache spark 如何加快一个复杂数据集的处理/写入
我有一个函数,它抛出大量数据(数十亿行)并返回元组 数据集[(序号[Data1],序号[Data2],序号[Data3])] 此结果数据集包含更多的行(与输入相比) 现在我需要将这3个序列写入单独的avro文件 如何有效地做到这一点 目前我使用flatmap函数来分离这些序列:Apache spark 如何加快一个复杂数据集的处理/写入,apache-spark,apache-spark-dataset,Apache Spark,Apache Spark Dataset,我有一个函数,它抛出大量数据(数十亿行)并返回元组 数据集[(序号[Data1],序号[Data2],序号[Data3])] 此结果数据集包含更多的行(与输入相比) 现在我需要将这3个序列写入单独的avro文件 如何有效地做到这一点 目前我使用flatmap函数来分离这些序列: result.flatMap( row => row._1).write.mode(SaveMode.Append).avro(path1) //Data1 result.flatMap( row => r
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,您可以尝试缓存结果,如果内存足够,结果将被缓存,否则缓存将失败,结果将被重新计算。您可以尝试缓存结果,如果内存足够,结果将被缓存,否则缓存将失败,结果将被重新计算。关于ds.persist(仅限StorageLevel.DISK_)的情况如何?我试过了,但到目前为止没有明显的改进。persist(仅限StorageLevel.DISK_)会将ds缓存在磁盘中。如果ds很大,则从磁盘读取ds将花费大量时间。至于ds.persist(仅限StorageLevel.DISK_)呢?我试过了,但到目前为止没有明显的改进。persist(仅StorageLevel.DISK_)会将ds缓存在磁盘中。如果ds很大,则从磁盘读取ds将花费大量时间。
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