如何移除ADF数据流处理后Header末尾的多余管道符?
解决ADF数据流Union后Header行末尾多余管道符的问题
针对Header列数少于Body、Union后Header行因补空列出现多余管道符的问题,提供三种实用的ADF数据流处理方案:
方案1:固定列数下直接拼接Header原有列
如果Header的列数固定(比如仅2列),可在Union后添加派生列转换,针对性处理Header行:
- 假设拆分时已标记行类型字段(如
isHeader,true代表Header行),派生列表达式如下:iif(isHeader == true, concat(col1, '|', col2), concat_ws('|', col1, col2, col3, col4))- Header行:直接拼接原始列,还原成
Header1|id1格式 - Body行:用
concat_ws拼接所有列,保留原有多列的管道分隔结构
- Header行:直接拼接原始列,还原成
- 后续用选择转换仅保留该派生列,输出时即可避免多余管道符。
方案2:动态移除末尾多余管道符
如果Header列数不固定,可通过字符串替换处理整行:
- 在Union后添加派生列,用以下表达式拼接所有列并清理末尾空管道:
replace(concat_ws('|', *), '\\|+$', '')concat_ws('|', *):将所有列拼接为完整的管道分隔字符串replace:通过正则匹配末尾的1个或多个管道符,直接替换为空
- 输出时选择该处理后的字符串列,Header和Body都会保持正确格式。
方案3:拆分阶段保留Header原始行
从源读取时就避免解析Header列,直接保留原始字符串:
- 源数据集配置为读取整行作为单个字符串列(命名为
rawLine) - 用筛选转换拆分Header和Body:
- 筛选Header行:
rowNumber() == 1(若Header为第一行)或匹配特定内容 - 筛选Body行:对这些行用拆分列转换按管道拆分成多列,完成后续处理
- 筛选Header行:
- 处理完Body后,将Body的拼接列(用
concat_ws('|', *)生成)与Header的rawLine列做Union,此时Header行保持原始格式,不会出现多余管道符。
内容的提问来源于stack exchange,提问作者Debashish
相关产品推荐
相关产品推荐

