ADF源启用schema drift时展开动态JSON数组报scala.MatchError如何解决
你遇到的
scala.MatchError错误核心原因是:ADF数据流Flatten转换的Unroll By字段不支持直接传入包含byName()的动态构造函数节点。开启schema drift后元数据在编译期不存在,你写的array(byName('Columnname'))会被识别为未解析的函数节点,无法匹配Unroll By要求的列引用类型,就会触发匹配错误。
正确操作步骤
1. 新增派生列转换预处理动态数组列
在源转换和Flatten转换之间插入派生列转换,提前将动态数组列提取为可被直接引用的普通列:
- 如果目标数组是顶层列,派生列表达式写:
target_array = byName('Columnname') - 如果目标数组是嵌套在其他对象下的列,比如路径为
parent_obj.child_array,派生列表达式写:target_array = byName('parent_obj').getItem('Columnname')
派生列配置时可以手动将输出类型指定为对应的数组类型(比如数组元素为对象则选Array(Complex),元素为字符串则选Array(String)),避免运行时类型推断异常
2. Flatten转换中直接引用预处理后的数组列
进入Flatten转换配置页面,Unroll By字段直接选择上一步生成的target_array列即可。如果下拉列表中看不到该列,手动输入列名target_array即可,开启schema drift的场景下ADF会在运行时自动匹配对应的列。
注意事项
- Unroll By字段仅支持直接传入列引用,不支持直接传入
byName()、array()这类运行时计算的函数表达式,这是ADF数据流的现有规则 - 如果数组列名本身也是动态的,可通过数据流参数传递列名,派生列表达式调整为
byName($数组列名参数)即可 - 建议在源转换的Projection配置项中开启
Infer drifted column types,让ADF自动推断漂移列的数据类型,减少手动配置的工作量
内容的提问来源于stack exchange,提问作者Rashmi
相关产品推荐
相关产品推荐

