处理K友的问题,打断了原来的发表计划。但渡人即渡己,就将解决问题的思路记录,权当第三个实例吧。
一、需求说明
初看起来,K友调用第三方Web接口,返回的是JSON文本(如图1),第一感觉是通过JSON Input控件并设置JSONPath来提取数据。

图1:第三方接口返回数据片段
但细看才明白,返回数据完全是平面的,没有任何层次化结构。每一个Key-Value对,其中的Key都不同。图1中标红的三个键值对如下:
"T102302_1LEL":"0"
"T10210702_1LEL":"12572906"
"T10210902_1LEL":"10829295"
语义开始慢慢清晰起来。每一个Key都带了一个主键和字段名在其中,value即是该主键行对应字段的值。所以,前述三个键值对,可以形成如下二维表:
| 主键 | LEL |
| 102302 | 0 |
| 10210702 | 12572906 |
| 10210902 | 10829295 |
如果进一步联合解析出其他字段的值,那么最终可以形成一个客户需要的完整二维表格。如图2所示,仅选择gc、lel、windspeed三个字段为例。
图2:示例结果表格
二、解决方案
以下是作者思路,如图3所示。

图3:总体思路
1、拆分为行
如果列名都是动态的,这显然超出了以行集为根基的Kettle处理能力。所以首先我们需要将图1中的数据,以逗号为分割,拆分为行。
2、解析字段值
行拆分后,得到的大部分字符串都是Key:Value的形式。我们可以通过正则表达式,解析出其中的主键值以及对应字段值。
3、排序连接
各字段值都获取后,通过排序和内连接,可以将各路解析结果,联合形成图2中的表格,作为最终输出的基本结果。
4、清洗导出
最后需要对异常值进行处理,对格式进行归整,必要时也可以对类型进行转换,并最终导出到文件。
三、主要配置
列拆分为多行的配置相当简单,主要设置分隔符为逗号。

图4:列拆分为多行
2、正则表达式
正则表达式的配置比较关键,涉及主键字段和字段值的提取。正则表达式如下:
[\S\s]*T([\S]*?)_1LEL\":\"([\S\s]*)
注意这个步骤的表达式必须全部匹配整个文本,才能解析出各组的值。
第一部分:[\S\s]*T,匹配任何字符直到遇见T字符止
第二部分:([\S]*?)_1LEL\":,匹配从T字符后到冒号前的部分,其中第一个组捕获用于提取主键字段
第三部分:\"([\S\s]*),匹配冒号后双引号之外的部分,并设置第二个组捕获用于提取lel字段的值。

本文利用列拆分多行以及记录集的连接,为动态列数据提供了一种解析思路,类似问题可以参考。如需下载实例,请扫码:





