Pentaho DI-JSON嵌套文件输出

Pentaho DI-JSON嵌套文件输出,json,pentaho,kettle,pentaho-spoon,pdi,Json,Pentaho,Kettle,Pentaho Spoon,Pdi,我需要从多个表中获取记录。主表与其他表具有一对多关系 我的数据源是Oracle DB。Oracle db具有指定的表。一个叫学生,另一个叫学科 对于示例,我有一个Student表,其中“Student_Id”是主键,其他列如firstname、lastName等。每个学生都注册了多个科目,因此我们将Student_Id作为subjects表的外键。科目表包含科目名称、状态、教师姓名等,即学生可以有多个科目。在学生表中,我有学生的电话号码,比如他的家庭电话、手机和家长的联系电话。这3个数字应作为一

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


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

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

所以要求将学生表中的所有学生和每个学生对应的科目显示为一个数组,并显示每个学生的电话号码。输出应为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 DI中,JSON输出步骤不支持嵌套数据集。为了实现嵌套JSON结构,需要使用Javascript步骤构建嵌套结构并最终传递到输出

通常的流程如下:
Input->Group By->Modified Javascript(JSON.Stringfy)->文本文件输出(存储为.js扩展名,不带头)

流程的示例屏幕截图如下所示:

注意:这不是一个精确的解决方案,但给出了更清晰的步骤和流程

修改JS步骤以构建嵌套结构。注意,这是基于MySQL(sakila)的默认工作数据库。我在使用
演员->电影(电影)
关系;与您的
学生->科目
类似的数据集

//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);
//初始化步骤->根据您的数据集进行更改
var json={};
json.movie={};
儿童账户=[];
var split_film_id=[];
var split_title=[];
var split_descr=[];
//非嵌套结构->在您的场景中,这些将是学生ID和姓名
json.movie.actor_id=actor_id;
json.movie.first_name=first_name;
json.movie.last_name=last_name;
//拆分数据
split_film_id=film_id.split(“;”);
split_title=title.split(“;”);
split_descr=description.split(“;”);
//循环分割的数据并构建子结构

对于(i=0;iPentaho只是一个数据集成工具。您需要指定源数据结构。目前我们甚至不知道数据是如何存储的以及数据来自何处。我的数据源是Oracle DB。Oracle DB有指定的表。一个称为学生,另一个称为主题。但如何存储数据很重要。向我们展示示例数据。他说llo,我有两个简单的步骤,一个是javascript步骤,另一个是文件输出。我的javascript步骤有:var json;json=“HI”;var JsonOutput=json.stringify(json);不知何故,我的输出文件没有得到任何数据。除此之外,脚本步骤没有显示生成的任何输出。你知道会出现什么问题吗?