Pentaho D - JSON 嵌套文件输出
Pentaho DI - JSON Nested File Output
我有一个要求,需要从多个 table 中获取记录。主要 table 与其他 table 具有一对多关系。
我的数据源是 Oracle 数据库。 Oracle 数据库具有指定的 tables。一个叫 Student,一个叫 Subjects。
例如,我有一个学生 Table,其中 "Student_Id" 是主键和其他列,如名字、姓氏等。每个学生都注册了多个科目,所以我们有 student_id 是主题 table 的外键。科目 table 具有科目名称、状态、教师姓名等,即一个学生可以有多个科目。在学生 table 中,我有学生 phone 号码,例如他的家 phone、手机 phone 和家长的联系电话。这 3 个数字应该作为一个对象出现在学生节点下,如下所示。
所以要求是显示学生 table 的所有学生及其每个学生的相应科目作为数组,以及每个学生的 Phone 数字。输出应为 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) -> Text file output (stored as .js extension without header)
流程示例截图如下:
注意:这不是一个精确的解决方案,但可以更清楚地了解步骤和流程。
修改了构建嵌套结构的JS步骤。请注意,这是基于来自 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);
其余步骤很简单。
示例输出
希望这对您有所帮助:)
要点已上传here。
我有一个要求,需要从多个 table 中获取记录。主要 table 与其他 table 具有一对多关系。
我的数据源是 Oracle 数据库。 Oracle 数据库具有指定的 tables。一个叫 Student,一个叫 Subjects。
例如,我有一个学生 Table,其中 "Student_Id" 是主键和其他列,如名字、姓氏等。每个学生都注册了多个科目,所以我们有 student_id 是主题 table 的外键。科目 table 具有科目名称、状态、教师姓名等,即一个学生可以有多个科目。在学生 table 中,我有学生 phone 号码,例如他的家 phone、手机 phone 和家长的联系电话。这 3 个数字应该作为一个对象出现在学生节点下,如下所示。
所以要求是显示学生 table 的所有学生及其每个学生的相应科目作为数组,以及每个学生的 Phone 数字。输出应为 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) -> Text file output (stored as .js extension without header)
流程示例截图如下:
注意:这不是一个精确的解决方案,但可以更清楚地了解步骤和流程。
修改了构建嵌套结构的JS步骤。请注意,这是基于来自 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);
其余步骤很简单。
示例输出
希望这对您有所帮助:)
要点已上传here。