我正在尝试将数据从delta加载到pysparkDataframe中。
path_to_data = 's3://mybucket/daily_data/'
df = spark.read.format("delta").load(path_to_data)
现在,基础数据按日期划分为
s3://mybucket/daily_data/
dt=2020-06-12
dt=2020-06-13
...
dt=2020-06-22
有没有办法优化read as dataframe,给定:
只需要特定的日期范围
只需要列的子集
目前我尝试的方法是:
df.registerTempTable("my_table")
new_df = spark.sql("select col1,col2 from my_table where dt_col > '2020-06-20' ")
# dt_col is column in dataframe of timestamp dtype.
在上述状态下,spark是否需要加载整个数据,根据日期范围过滤数据,然后过滤需要的列?在pyspark read中是否有任何优化可以用来加载已经分区的数据?
关于以下内容:
df = spark.read.format("delta").load(path_to_data,cols_to_read=['col1','col2'])
or
df = spark.read.format("delta").load(path_to_data,partitions=[...])
1条答案
按热度按时间1dkrff031#
在您的情况下,不需要额外的步骤。优化将由spark负责。因为您已经基于列对数据集进行了分区
dt
当您尝试查询具有分区列的数据集时dt
作为过滤条件。spark只加载源数据集中与筛选条件匹配的数据子集,在您的情况下是这样的dt > '2020-06-20'
.spark在内部执行基于优化的分区修剪。