如何用Talend根据主活动文件删除多对多关系文件中的主活动行
解决Talend中删除公司主活动行的方案
我之前处理过类似的需求,用Talend的组件组合就能轻松搞定,下面是具体的实现步骤:
方案思路
核心逻辑是将所有活动数据与主活动数据做左关联,筛选出未匹配到主活动的行——这些未匹配的行就是各公司非主活动的记录,正是我们需要保留的内容。
具体实现步骤
1. 读取两个源文件
- 拖拽两个
tFileInputDelimited组件到画布,分别命名为tFileInput_AllActivities(读取n:n的所有活动文件)和tFileInput_MainActivities(读取1:1的主活动文件)。 - 分别配置两个组件的文件路径、分隔符(你的示例里是
|,记得在配置里正确设置,注意转义问题),并映射好COMPANY_ID和ACTIVITY_ID这两个列。
2. 优化主活动数据的查询(可选但推荐)
如果主活动文件数据量较大,建议先把主活动数据存入内存哈希表,提升后续关联的效率:
- 拖拽一个
tHashOutput组件,连接tFileInput_MainActivities的输出端口。 - 配置
tHashOutput,设置一个唯一的哈希名称(比如mainActivitiesHash),并勾选COMPANY_ID和ACTIVITY_ID作为需要存储的列。
3. 关联并筛选目标数据
- 拖拽一个
tMap组件:- 将
tFileInput_AllActivities的输出作为主输入流; - 如果用了哈希表优化,就拖拽
tHashInput组件(配置为读取刚才创建的mainActivitiesHash)作为Lookup输入流;如果数据量小,也可以直接把tFileInput_MainActivities作为Lookup输入流。
- 将
- 在tMap的关联规则区域,设置匹配条件:
mainActivities.COMPANY_ID == allActivities.COMPANY_ID && mainActivities.ACTIVITY_ID == allActivities.ACTIVITY_ID - 在tMap的输出区域,创建一个新的输出流(比如命名为
NonMainActivities),只勾选主输入流(allActivities)的COMPANY_ID和ACTIVITY_ID列。然后给这个输出流添加过滤条件:
这个条件的意思是:所有活动的行中,没有匹配到对应公司主活动的记录——也就是我们要保留的非主活动行。mainActivities.COMPANY_ID == null
4. 输出结果文件
- 拖拽一个
tFileOutputDelimited组件,连接tMap的NonMainActivities输出流。 - 配置输出文件的路径、分隔符,映射好对应的列,运行作业后就能得到只保留非主活动的结果文件了。
小数据量简化方案
如果你的数据量很小,也可以用更简洁的方式实现:
- 用
tJoin组件将两个文件的数据做内连接,得到所有主活动的行; - 用
tHashOutput把这些主活动行存入内存哈希表; - 读取所有活动文件后,用
tFilterRow组件判断当前行的(COMPANY_ID, ACTIVITY_ID)组合是否不存在于哈希表中,符合条件的行直接输出即可。
不过第一种用tMap左关联+过滤的方案是最直观且高效的,推荐优先使用。
内容的提问来源于stack exchange,提问作者K4tn1x
相关产品推荐
相关产品推荐

