我正在尝试为通用脏/干净映射操作构建 ADF 映射数据流 - 其目的是查看特定列中的脏值并将其替换为干净值。我已经有了如下所示的 Dirty/Clean 数据集:
column_name | 脏 | 干净 |
---|---|---|
手机 | (555) 123-1234 | (555) 124-6578 |
手机 | 不适用 | 未知 |
产品 | ACME 剃须刀 1265 | ACME Shaver vPro 2 |
区域 | SA | 南非 |
区域 | 英国 | 英国 |
这些都只是例子,但你明白了要点。该数据是较早生成的,并且该部分工作正常。我已将此数据集放入缓存接收器中。
好的,现在需要清理我传入的原始数据文件。它看起来像这样:
id | customer_id | order_date | 区域 | 产品 | 手机 |
---|---|---|---|---|---|
1 | 1235599 | 2021-06-14 | 德国 | 蒙多花洒 | (334) 987-0098 |
2 | 9823999 | 2021-06-10 | 美国 | ACME 剃须刀 1265 | 不适用 |
3 | 2223593 | 2020-12-15 | SA | 割草机 3000 | (555) 123-1234 |
4 | 8989098 | 2021-02-04 | 英国 | Power Sprayer 2.5 | 不适用 |
目标是用好的值替换脏值。由于我的脏/清洁映射文件在缓存接收器中,我认为我可以使用派生列活动以及缓存查找来查找清洁值,将当前列名和当前值(脏)作为键。我做了一个基于规则的映射表达式来获取需要清理的列:
What should go in the red box?
我通过这个表达式得到了我需要处理的列:
!isNull(ColumnNamesCache#lookup(name).column_name)
这使用了一个单独的缓存,它只包含需要清理的不同列名,并且工作正常。
但是,下一次查找是在表达式构建器的值部分执行的,以获取 Clean 值(如果存在),需要列名,这就是我卡住的地方。
当您在表达式构建器的值部分中时,“$$”表达式指的是 VALUE,而仅当您在列部分中时,它才指代 COLUMN NAME。如何获取值表达式中的当前列名?
所以本质上,我需要在 Value 中使用这种表达式来执行任何潜在 Clean 值的查找:
How to get the Column Name in the Value Expression?
这是目前为止的表达:
iif(!isNull(EntityDCCache#lookup('CURRENT COLUMN NAME HERE', toString($$)).clean), EntityDCCache#lookup('CURRENT COLUMN NAME HERE', toString($$)).clean, toString($$))
注意:我知道我正在执行两次查找并且效率低下。如果我解决了这个问题,我会努力解决这个问题! :)
EntityDCCache 是 Dirty/Clean 数据集,它需要两个键 - 列名和原始(脏)值。如果找到,表达式将用干净的值替换原始值。如果不是,它只是保持原始值。
再想一想,如果在这种情况下无法获得列名,那么在前面的步骤中将列名作为每个原始值的前缀怎么样?
因此值可能是 product_ACME Shaver 1265、phone_(555) 123-1234 等。我知道可能很昂贵,但如果我能做到这一点,我就可以轻松地提取两个值以进行清洁值查找。
感谢您的帮助!我希望有一些简单的东西我错过了。这旨在无模式并适用于各种不同的文件。
附注。我还没有尝试过 Pivots 等,但可以对其开放(phone_dirty、phone_clean、product_dirty、product_clean 等),但不确定 JOIN 表达式是否可以工作以及它会是什么样子。
感谢您的任何想法!
真诚的
杰森