Используйте шаг ввода JSON для обработки неравномерных данных - PullRequest
9 голосов
/ 22 февраля 2012

Я пытаюсь обработать следующее с шагом ввода JSON:

{"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"}
]}

Однако это кажется невозможным:

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.

Этот шаг обеспечивает ИгнорироватьФлаг отсутствия пути , но он работает, только если все строки пропускают один и тот же путь.В этом случае этот шаг действует, как и ожидалось, и заполняет пропущенные значения нулем.

Это ограничивает возможности этого шага для чтения неровных данных, что на самом деле было одним из моих приоритетов.

МойШаг Поля определяются следующим образом:

JSON Input Fields definition

Я что-то упустил?Это правильное поведение?

Ответы [ 2 ]

11 голосов
/ 14 марта 2012

Я использовал JSON Input, используя $ .address [*], чтобы прочитать в поле jsonRow полную карту каждого элемента pe:

{"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 jsonRows по одному для каждого элемента., pe jsonRow = {"AddressId":"1_101","Street":"Another Street"}.Затем, используя шаг Javascript, я отображаю свои значения следующим образом:

var AddressId = getFromMap('AddressId', jsonRow);
var Street = getFromMap('Street', jsonRow);
var Locality = getFromMap('Locality', jsonRow);

Во второй вкладке скрипта я вставил минимизированный код анализа JSON из https://github.com/douglascrockford/JSON-js и функцию getFromMap:

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]
}
2 голосов
/ 12 июля 2013

Вы можете решить эту проблему, изменив JSONPath и разделив шаги на два шага ввода JSON.Следующий веб-сайт многое объясняет о JSONPath: http://goessner.net/articles/JsonPath/

$..AddressId

Фактически возвращает все AddressId в массиве адресов, НО, поскольку Pentaho использует строки сетки для ввода и вывода [4 строки x 3 столбца], он не может обработать пропущенное значение, иначе нулевое значение, когда вы хотите, поскольку результаты возвращают все улицы (3 строки) и возвращают всю локальность (2 строки), просто потому, что в самом массиве нет нулевых значений, как у васне могу выехать из вашего гаража с 3 колесами на вашем автомобиле вместо обычных 4.

Я полагаю, ваш скрипт возвращает нулевые (где X ноль) значения, такие как:

A S X
A S X
A S L
A X L

Этого же шага сценария можно избежать, изменив путь Поля первого шага JSONinput на:

$.address[*]

Это для получения всех 4 строк адреса.Создайте следующий шаг JSONinput на основе нового поля источника, которое содержит адресную строку (и) для получения сведений об адресе в строке:

$.AddressId
$.Street
$.Locality

Это дает нулевые значения в четырех адресных строках, когда адрес подробнонедоступен в адресной строке.

...