【问题标题】:Pentaho DI - JSON Nested File OutputPentaho DI - JSON 嵌套文件输出
【发布时间】:2018-12-20 16:17:06
【问题描述】:

我有一个需求,我需要从多个表中获取记录。主表与其他表具有一对多关系。

我的数据源是 Oracle DB。 Oracle db 具有指定的表。一个叫Student,另一个叫Subjects。

例如,我有一个 Student 表,其中“Student_Id”是主键,其他列如 firstname、lastName 等。每个学生都注册了多个科目,因此 student_id 是 Subjects 表的外键。科目表有科目名称、状态、教师姓名等,即一个学生可以有多个科目。在学生表中,我有学生的电话号码,例如他的家庭电话、手机和家长的联系电话。这 3 个数字应作为一个对象出现在学生节点下,如下所示。

因此要求将学生表中的所有学生以及每个学生的相应科目显示为数组和每个学生的电话号码。输出应为 Json 格式。

我给出了下面的结构。请让我知道如何使用 Pentaho 数据集成工具来实现这一点。我对这项技术非常陌生。

    {
  "data": [
    {
      "Student_ID": "1",
      "FirstName": "fname1",
      "LastName": "lname1",
      "subjects": [
        {
          "Name": "Physics",
          "Status": "Active",
          "Teacher": "Teacher1"
        },
        {
          "Name": "History",
          "Status": "InActive",
          "Teacher": "Teacher2"
        }
      ],
      "Phone": {
        "Home": "123456",
        "Cell": "3456790",
      }
    },
    {
      "Student_ID": "2",
      "FirstName": "fname2",
      "LastName": "lname2",
      "subjects": [
        {
          "Name": "Geography",
          "Status": "Active",
          "Teacher": "Teacher1"
        },
        {
          "Name": "English",
          "Status": "InActive",
          "Teacher": "Teacher2"
        }
      ],
      "Phone": {
        "Home": "123456",
        "Cell": "3456790",
      }
    }
  ]
}

【问题讨论】:

  • Pentaho 只是一个数据集成工具。您需要指定源数据结构。目前我们甚至不知道这些数据是如何存储的以及它来自哪里。
  • 我的数据源是Oracle DB。 Oracle db 具有指定的表。一种叫做学生,另一种是学科。
  • 但是如何存储数据很重要。向我们展示示例数据。

标签: json pentaho kettle pentaho-spoon pdi


【解决方案1】:

在 Pentaho DI 中,JSON 输出步骤不支持嵌套数据集。为了实现嵌套的 JSON 结构,您需要使用 Javascript 步骤来构建嵌套结构并最终传递到输出。

通常的流程如下: Input -> Group By -> Modified Javascript (JSON.Stringfy) -> Text file output (stored as .js extension without header)

流程示例截图如下:

注意:这不是一个精确的解决方案,但可以更清楚地了解步骤和流程。

修改 JS Step 以构建嵌套结构。请注意,这是基于 MySQL (sakila) 的默认工作数据库。我正在使用actor -> film(movie) 关系;与您的 student -> subject 类似的数据集。

//Initialization Steps -> Change this according to your data set
var json = {};
json.movie={};
Child_Accounts = []; 
var split_film_id   =[];
var split_title     =[];
var split_descr     =[];

//Non Nested Structure -> In your scenario these would be Student ID and Names
json.movie.actor_id     = actor_id;
json.movie.first_name   = first_name;
json.movie.last_name    = last_name;

//splitting the data
split_film_id   = film_id.split(';');
split_title     = title.split(';');
split_descr     = description.split(';');

// Loop through the splitted data and build the child structure
for(i=0; i<split_film_id.length; i++){
    var childCol = {};
    childCol.film_id=split_film_id[i];
    childCol.title=split_title[i];
    childCol.description=split_descr[i];
    Child_Accounts.push(childCol);
 }
 json.movie.films=Child_Accounts;

 // JSON Stringify the data object
 var JsonOutput = JSON.stringify(json);

其余步骤都很简单。

样本输出

希望这会有所帮助:)

Gist 已上传 here

【讨论】:

  • 您好,我有两个简单的步骤,一个是 javascript 步骤,另一个是文件输出。我的 javascript 步骤有: var json; json = "你好"; var JsonOutput = JSON.stringify(json);不知何故,我的输出文件没有得到任何数据。最重要的是,脚本步骤不显示任何产生的输出。知道可能是什么问题吗?
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 2023-03-28
  • 2021-07-17
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多