Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何加快一个复杂数据集的处理/写入_Apache Spark_Apache Spark Dataset - Fatal编程技术网

Apache spark 如何加快一个复杂数据集的处理/写入

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

我有一个函数,它抛出大量数据(数十亿行)并返回元组

数据集[(序号[Data1],序号[Data2],序号[Data3])]

此结果数据集包含更多的行(与输入相比)

现在我需要将这3个序列写入单独的avro文件

如何有效地做到这一点

目前我使用flatmap函数来分离这些序列:

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