Azure Data Flows:筛选含指定子串的Parquet行并提取子串问题
解决方案
问题核心
你之前的筛选条件失效,是因为空数组≠Null,且你误将空数组和含空字符串的数组混淆,导致无法过滤无匹配的行。
修正后的完整流程
1. 源读取
保持原步骤:读取目标Parquet文件。
2. 派生列优化
如果文本列存在多连续空格,先做归一化处理再分割,避免生成空字符串干扰匹配结果,派生列表达式改为:
array_intersect(split(regexp_replace(text_column, '\\s+', ' '), ' '), array('array','of','words'))
注:
regexp_replace(text_column, '\\s+', ' ')用于将多个连续空格替换为单个空格,确保分割结果都是有效单词。
3. 筛选条件修正
针对空数组和Null的正确过滤条件:
- 基础版(假设
words列不会为Null):size(words) > 0 - 兼容版(覆盖Null和空数组两种情况):
not(isNull(words)) and size(words) > 0
原条件无效原因说明
not(isNull(words)):空数组不属于Null类型,无法过滤空数组行word != array(''):intersect返回的是空数组array(),而非包含空字符串的数组array(''),条件不匹配not(isNull(word[1])):空数组没有索引1,会直接返回Null,逻辑完全错误
4. 接收器
保持原步骤:输出处理后的结果。
高效替代方案
如果你的计算引擎支持array_contains_any类函数,可以跳过派生列步骤,直接在筛选阶段判断,减少中间列开销:
array_contains_any(split(text_column, ' '), array('array','of','words'))
若仍需保留匹配子串列,可在筛选后再生成words列。
内容的提问来源于stack exchange,提问作者ClockWork
相关产品推荐
相关产品推荐

