[英]Spark Dataframe Filter Optimization
我正在从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重新加载它。
你打电话时
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作业。 因此,现在数据将被加载到群集上,并将其写入内存(由于进行缓存),然后从缓存中读取它,并根据您的查询计划对其进行过滤,排序和进一步处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.