如何在Talend tMap中将列表型数值转换为独立单行元素
问题原因
你当前作业出不了1000行拆分结果的核心问题是:tMap默认是1行输入对应1行输出的映射逻辑,本身不会自动把单字段里的多值拆成多行,你现有配置大概率只是对代码字段做了字符串层面的处理,没有触发行裂变逻辑,最终输出行数和输入表的行数一致,自然达不到预期。
实现方案
你可以选两种方式实现,第一种纯靠tMap完成,第二种用配套组件更简便:
方案1:纯tMap配置实现
- 第一步:进入tMap的变量(var)面板,新增两个临时变量:
- 变量名
codeArr,类型设置为String[],赋值表达式写StringHandling.split(inputRow.codeList, ","),作用是把每条记录里用逗号分隔的代码串拆成数组 - 变量名
codeTotal,类型为Integer,赋值表达式写codeArr.length,拿到当前这条州记录对应的代码总个数
- 变量名
- 第二步:选中你配置的输出表,在右侧属性面板找到拆分记录(Split record) 选项打勾,开启行裂变能力
- 第三步:配置输出字段映射:
- 州名称字段直接映射输入表的对应州名字段即可
- 拆分后的单代码字段,赋值表达式写
codeArr[Numeric.sequence("codeSplitSeq", 1, 1) - 1],用内置序列生成数组索引 - 在拆分记录的循环终止条件栏填写
Numeric.sequence("codeSplitSeq", 1, 1) <= codeTotal,约束每条输入记录生成的行数等于该记录下的代码个数 - 新增一条行处理后触发的逻辑:当
Numeric.sequence("codeSplitSeq",1,1) == codeTotal时,执行Numeric.resetSequence("codeSplitSeq")重置序列,避免不同州记录的索引累加错位
- 第四步:运行作业后统计输出行数,所有州的代码数量累加为1000即配置正确。
方案2:搭配tNormalize实现(更推荐,配置量少出错率低)
- 不需要在tMap里做复杂的序列和数组配置,直接在输入表和tMap之间加一个
tNormalize组件 - tNormalize配置项里,选择要拆分的代码列表字段,分隔符填写英文逗号
,,组件会自动把单字段里的多值拆成多行,州名字段会自动复制到每一行 - 后面接tMap只需要做简单的字段重命名、格式调整即可,最终输出行数就是所有代码的总条数,直接就能得到你要的1000行结果。
避坑提醒
不要直接在tMap输出字段里写split函数就期望得到多行结果:不开启拆分记录开关的话,split返回的数组只会被当做单个对象处理,最终要么输出数组内存地址,要么只取第一个元素,行数完全不会增加。
配置序列的时候一定要记得按单条输入记录重置,不然会出现数组越界报错、代码和州名匹配错位的问题。
内容的提问来源于stack exchange,提问作者Compte Gmail
相关产品推荐
相关产品推荐

