Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JSON输入步骤处理不均匀数据_Json_Pentaho_Kettle_Data Integration - Fatal编程技术网

使用JSON输入步骤处理不均匀数据

使用JSON输入步骤处理不均匀数据,json,pentaho,kettle,data-integration,Json,Pentaho,Kettle,Data Integration,我尝试使用JSON输入步骤处理以下内容: {“地址”:[ {“AddressId”:“1_1”,“Street”:“A Street”}, {“AddressId”:“1_101”,“街”:“另一条街”}, {“AddressId”:“1_102”,“Street”:“One more Street”,“Location”:“Buenos Aires”}, {“AddressId”:“1_102”,“地点”:“纽约”} ]} 然而,这似乎不可能: Json Input.0 - ERROR (v

我尝试使用JSON输入步骤处理以下内容:

{“地址”:[
{“AddressId”:“1_1”,“Street”:“A Street”},
{“AddressId”:“1_101”,“街”:“另一条街”},
{“AddressId”:“1_102”,“Street”:“One more Street”,“Location”:“Buenos Aires”},
{“AddressId”:“1_102”,“地点”:“纽约”}
]}
然而,这似乎不可能:

Json Input.0 - ERROR (version 4.2.1-stable, build 15952 from 2011-10-25 15.27.10 by buildguy) : 
The data structure is not the same inside the resource! 
We found 1 values for json path [$..Locality], which is different that the number retourned for path [$..Street] (3509 values). 
We MUST have the same number of values for all paths.
该步骤提供忽略缺少的路径标志,但它仅在所有行都缺少同一路径时起作用。在这种情况下,该步骤的作用与预期的一样,将用null填充缺少的值

这限制了这一步骤读取不均匀数据的能力,这确实是我的优先事项之一

我的步骤字段定义如下:


我错过什么了吗?这是正确的行为吗?

我所做的是使用JSON输入,使用$.address[*]向jsonRow字段读取每个元素的完整映射,即:

{"address":[
    {"AddressId":"1_1","Street":"A Street"},  
    {"AddressId":"1_101","Street":"Another Street"},  
    {"AddressId":"1_102","Street":"One more street", "Locality":"Buenos Aires"},   
    {"AddressId":"1_102","Locality":"New York"} 
]}
这将导致4个jsonRow,每个元素一个jsonRow,即
jsonRow={“AddressId”:“1_101”,“Street”:“Other Street”}
。然后使用Javascript步骤,我使用以下方法映射我的值:

var AddressId = getFromMap('AddressId', jsonRow);
var Street = getFromMap('Street', jsonRow);
var Locality = getFromMap('Locality', jsonRow);
在第二个脚本选项卡中,我插入了来自和getFromMap函数的缩小JSON解析代码:

function getFromMap(key,jsonRow){
  try{
   var map = JSON.parse(jsonRow);
  }
  catch(e){
   var message = "Unparsable JSON: "+jsonRow+" Desc: "+e.message;
   var nr_errors = 1;
   var field = "jsonRow";
   var errcode = "JSON_PARSE";
   _step_.putError(getInputRowMeta(), row, nr_errors, message, field, errcode);
   trans_Status = SKIP_TRANSFORMATION;
   return null;
  }

  if(map[key] == undefined){
   return null;
  }
  trans_Status = CONTINUE_TRANSFORMATION;
  return map[key]
}

您可以通过更改JSONPath并将步骤分为两个JSON输入步骤来解决此问题。以下网站解释了许多关于JSONPath的内容:

实际上返回地址数组中的所有AddressId,但由于Pentaho使用网格行进行输入和输出[4行x 3列],因此当您希望返回所有街道(3行)和所有位置(2行)时,它无法处理缺少的值(也称为null值),只是因为数组本身没有空值,就像在中一样,你不能用3个轮子而不是通常的4个轮子从车库里开车出来

我猜您的脚本会返回null(其中X为零)值,如:

A S X
A S X
A S L
A X L
通过将第一个JSONinput步骤的字段路径更改为:

$.address[*]
这是为了检索所有4个地址行。基于包含地址行的新源字段创建下一个JSONinput步骤,以检索每行的地址详细信息:

$.AddressId
$.Street
$.Locality

当地址行中没有地址详细信息时,这会在四个地址行上产生空值。

如果您可以从链接复制这里的答案元素,那就太好了:)(并接受您自己的答案,顺便说一句)完成!答案对你有用吗?晚了四年,但仍然是个好主意。我仍然有点失望,JSON输入步骤在设计上不支持这一点,因为首先将对象分解为元素,然后编译JS脚本有点昂贵+谢谢你的足智多谋。我测试了你的建议。运气不好,还是不行。看看这里嗨rsilva,你是对的。我刚刚完成了这项工作,通过使用第一个json输入步骤获取所有地址行,并使用另一个步骤获取街道/地址ID和位置(如果可用):这对我来说非常有效,似乎比公认的答案更优雅。接受的一种方法也应该有效,但最好尽可能避免使用Java脚本编写解决方案。
$.AddressId
$.Street
$.Locality