Spark数据框过滤器优化

时间:2019-09-05 07:30:58

标签: scala apache-spark apache-spark-sql

我正在从s3存储桶中读取大量文件。

读取这些文件后,我想对数据框执行过滤操作。

但是当执行过滤器操作时,数据将从s3存储桶中再次下载。如何避免重新加载数据帧?

我在过滤器操作之前尝试了缓存和/或持久化数据帧。但是,仍然以某种方式再次从s3存储桶中提取数据。

var df = spark.read.json("path_to_s3_bucket/*.json")

df.persist(StorageLevel.MEMORY_AND_DISK_SER_2)

df = df.filter("filter condition").sort(col("columnName").asc)

如果数据帧已缓存,则不应再次从s3重新加载。

1 个答案:

答案 0 :(得分:1)

致电时

var df = spark.read.json("path_to_s3_bucket/*.json")

在幕后发生的事情是spark会进行分区发现,文件列表和模式推断(如果您有很多文件,这可能会在后台运行sum作业并行执行文件列表)。

下一步,当您致电

df.persist(StorageLevel.MEMORY_AND_DISK_SER_2)

只有信息要传递给您要保留数据的查询计划,但是此刻暂时没有发生(这是一个懒惰的操作)。

下次致电时

df = df.filter("filter condition").sort(col("columnName").asc)
再次

仅更新查询计划。

现在,如果您调用诸如show()count()之类的操作,则查询计划将得到处理,并且将执行spark作业。因此,现在数据将被加载到群集上,并将其写入内存(由于进行缓存),然后从缓存中读取它,并根据您的查询计划对其进行过滤,排序和进一步处理。