如何使用spark.read就地过滤数据



我尝试从ADLS读取Delta格式的数据。我想使用适当的过滤器读取部分数据。在阅读JDBC格式时,同样的方法也适用于我

query = f"""
select * from {table_name} 
where 
createdate < to_date('{createdate}','YYYY-MM-DD HH24:MI:SS') or
modifieddate < to_date('{modifieddate}','YYYY-MM-DD HH24:MI:SS')
"""
return spark.read 
.format("jdbc") 
.option("url", url) 
.option("query", query) 
.option("user", username) 
.option("password", password) 
.option("driver", "oracle.jdbc.driver.OracleDriver") 
.load()

所以我尝试用类似的方式创建使用查询读取delta,但它读取整个表。

return spark.read 
.format("delta") 
.option("query", query) 
.load(path)

如果不阅读完整的df并过滤它,我如何解决这个问题?

提前感谢!

Spark使用一种称为谓词下推的功能来优化查询。在第一种情况下,过滤器可以传递到oracle数据库。

德尔塔不是这样运作的。可以通过数据跳过和Z排序进行优化,但由于您本质上是在查询镶木地板文件,因此必须读取内存中的所有文件,然后进行过滤。

最新更新