我正在从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重新加载。
答案 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作业。因此,现在数据将被加载到群集上,并将其写入内存(由于进行缓存),然后从缓存中读取它,并根据您的查询计划对其进行过滤,排序和进一步处理。>