Azure Databricks:筛选Delta表嵌套结构含指定元素的行
解决方案
要实现筛选出transform_options中存在至少一个条目满足order_duplicates_by包含_commit_version的行,同时保留这些符合条件的条目,可以结合filter和exists函数来完成:
最终查询语句
SELECT table_name, filter(transform_options, (k, v) -> array_contains(v.order_duplicates_by, '_commit_version')) AS updated_transform_options FROM prod.silver.platform_ctl_ingestion WHERE exists(map_values(transform_options), v -> array_contains(v.order_duplicates_by, '_commit_version'));
关键说明
行筛选逻辑:
使用exists(map_values(transform_options), v -> array_contains(v.order_duplicates_by, '_commit_version'))作为WHERE条件,判断当前行的transform_options中是否存在至少一个值的order_duplicates_by数组包含_commit_version,仅保留满足该条件的行。过滤无效Map条目:
使用filter函数遍历transform_options的键值对,仅保留符合条件的条目,避免原查询中保留NULL值条目的问题。
原查询问题分析
你之前的查询没有添加行筛选的WHERE子句,因此会返回所有行;同时transform_values只是将不符合条件的条目设为NULL,但不会移除这些条目。如果需要保留所有行但标记不符合的条目为NULL,只需在原查询基础上添加WHERE条件即可:
SELECT *, transform_values(transform_options, (k, v) -> CASE WHEN array_contains(v.order_duplicates_by, '_commit_version') THEN v ELSE NULL END ) AS updated_transform_options FROM prod.silver.platform_ctl_ingestion WHERE exists(map_values(transform_options), v -> array_contains(v.order_duplicates_by, '_commit_version'));
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

