Pentaho Kettle:如何动态获取 JSON 文件列

Posted

技术标签:

【中文标题】Pentaho Kettle:如何动态获取 JSON 文件列【英文标题】:Pentaho Kettle: How to dynamically fetch JSON file columns 【发布时间】:2020-09-13 19:24:25 【问题描述】:

背景:我在一家主要销售通行证的公司工作。客户下的每个订单都将包含 N 个通行证。

问题:我每天都有这些 JSON 事件事务文件从 DocumentDB (MongoDB) 进入 S3 存储桶。这个 JSON 文件与每个文档键(在我的例子中是一个命令)的相关类型的事件(插入、修改或删除)相关联。下面的示例说明了通过 S3 存储桶的“插入”类型的事件:


  "_id": 
    "_data": "11111111111111"
  ,
  "operationType": "insert",
  "clusterTime": 
    "$timestamp": 
      "t": 11111111,
      "i": 1
    
  ,
  "ns": 
    "db": "abc",
    "coll": "abc"
  ,
  "documentKey": 
    "_id": 
      "$uuid": "abcabcabcabcabcabc"
    
  ,
  "fullDocument": 
    "_id": 
      "$uuid": "abcabcabcabcabcabc"
    ,
    "orderNumber": "1234567",
    "externalOrderId": "12345678",
    "orderDateTime": "2020-09-11T08:06:26Z[UTC]",
    "attraction": "abc",
    "entryDate": 
      "$date": 2020-09-13
    ,
    "entryTime": 
      "$date": 04000000
    ,
    "requestId": "abc",
    "ticketUrl": "abc",
    "tickets": [
      
        "passId": "1111111",
        "externalTicketId": "1234567"
      ,
      
        "passId": "222222222",
        "externalTicketId": "122442492"
      
    ],
    "_class": "abc"
  

正如我们在上面看到的,每个 JSON 文件可能包含 N 次传递,并且每一次传递都 - 反过来 - 与一个外部票证 id 相关联,这是一个不同的列(如上所示)。我想使用 Pentaho Kettle 读取这些 JSON 文件并将数据加载到 DW 中。我知道 Json 输入步骤和 Row Normalizer 可以将“PassID 1”、“PassID 2”、“PassID 3”...“PassID N”列转换为 1 个唯一列“Pass”,我必须有将类似的逻辑应用于另一列“外部票证 ID”。这种方法的问题在于它是非常静态的,例如,我需要“告诉”Pentaho 在 Json 输入步骤中提前有多少通行证。但是,如果明天我有一个包含 10 个不同通行证的订单怎么办?如何动态执行此操作以确保作业不会中断?

【问题讨论】:

【参考方案1】:

如果你想要一个表格输出,比如

TicketUrl   Pass            ExternalTicketID
----------  ------          ----------------
abc         PassID1Value1    ExTicketIDvalue1
abc         PassID1Value2    ExTicketIDvalue2
abc         PassID1Value3    ExTicketIDvalue3

并根据 JSON 输入文件值使传入值动态化,然后您可以下载此转换Updated Link

我发现 JSON 输入中的一切都是动态的。

【讨论】:

完美,谢谢,我会看看,让你知道。 您好,我尝试使用您的方法,但收到以下消息:“JSON Input.0 - 资源内部的数据结构不同!我们找到 13 个 json 路径值 [$..passId] ,这与为路径 [$.fullDocument.ticketUrl] 返回的数字不同(1 个值)。我们必须为所有路径具有相同数量的值。”。你知道该怎么做吗?谢谢 我已经更新了转换。如果您还有其他需要,请告诉我。 嗨 Runa 感谢您更新此内容。我尝试运行新方法,但现在收到其他错误消息“选择值.0 - 错误(版本 7.0.0.0-25,buildguy 从 2016-11-05 15.35.36 构建 1):找不到字段'operation_type' 在行中!”。使用 2 个不同的 Json 输入步骤时,Pentaho 似乎由于某种原因找不到列“operation_type”? 错误似乎“选择值”步骤没有获得列操作类型。请确保“选择值”输入中心中的确切列名。您也可以分享您的转换,以便我可以查看问题。

以上是关于Pentaho Kettle:如何动态获取 JSON 文件列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pentaho 数据集成 (Kettle) 中的“用户定义的 Java 类”步骤中获取所有参数

从 Pentaho Kettle Job 的 java api 调用中获取数据

如何从 Pentaho Kettle 读取所有文件夹和子文件夹 使用 SFTP 步骤获取文件

使用 StAX / Kettle (Pentaho) 读取 XML 文件

Pentaho Kettle:邮寄转换的结果

Pentaho:如何将字段(= 列)动态添加到 OutputRow?