如何在Databricks中为Delta表的Great Expectations校验传递查询条件?
在Databricks中用Great Expectations校验Delta表子集的正确方式
你的问题出在batch_spec_passthrough里的query参数用法不对——Great Expectations的RuntimeBatchRequest不识别这个位置的查询条件,所以会直接加载全表数据。下面是两种可行的解决方法:
方法1:用Spark SQL查询直接获取数据子集
将reader_method改为spark_sql,并在runtime_parameters中传入完整的SQL查询语句(直接指定Delta表路径并添加过滤条件):
batch_request = RuntimeBatchRequest( datasource_name="datasource", data_connector_name="data_quality_run", data_asset_name="Input Data", runtime_parameters={ "query": "SELECT * FROM delta.`/delta table path` WHERE name = 'John'" }, batch_identifiers={"data_quality_check": f"data_quality_check_{datetime.date.today().strftime('%Y%m%d')}"}, batch_spec_passthrough={"reader_method": "spark_sql"} )
这种方式会让Great Expectations直接执行SQL查询,只加载符合过滤条件的数据,避免全表扫描。
方法2:通过Delta Lake的predicate参数过滤
如果坚持用delta作为reader_method,可以在reader_options中添加predicate参数,Delta Lake会自动应用这个过滤条件来读取子集数据:
batch_request = RuntimeBatchRequest( datasource_name="datasource", data_connector_name="data_quality_run", data_asset_name="Input Data", runtime_parameters={"path": "/delta table path"}, batch_identifiers={"data_quality_check": f"data_quality_check_{datetime.date.today().strftime('%Y%m%d')}"}, batch_spec_passthrough={ "reader_method": "delta", "reader_options": { "header": True, "predicate": "name = 'John'" } }, )
这个predicate参数会被Delta的阅读器解析,只加载满足条件的数据块,效率更高。
内容的提问来源于stack exchange,提问作者S.Dasgupta
相关产品推荐
相关产品推荐

