2016-07-01 13 views
2

Уже пробовал предложенную опцию JSONPath, но, похоже, JSONExtractor распознает только корневой уровень. В моем случае мне приходится иметь дело с вложенной json-структурой с массивом (см. Пример ниже). Любые опции для извлечения этого без нескольких промежуточных файлов?U-SQL - Извлечь данные из json-массива

"relation": { 
"relationid": "123456", 
"name": "relation1", 
"addresses": { 
    "address": [{ 
     "addressid": "1", 
     "street": "Street 1", 
     "postcode": "1234 AB", 
     "city": "City 1" 
     }, 
    { 
     "addressid": "2", 
     "street": "Street 2", 
     "postcode": "5678 CD", 
     "city": "City 2" 
    }] 
}} 

ВЫБЕРИТЕ отношение, адрес, улица, почтовый индекс, город?

+0

, пожалуйста, отправьте свой код, чтобы исправить ошибку. – morels

ответ

4

После фиксации вашего фрагмента JSON, чтобы:

{ 
    "relation": { 
     "relationid": "123456", 
     "name": "relation1", 
     "addresses": { 
      "address": [{ 
       "addressid": "1", 
       "street": "Street 1", 
       "postcode": "1234 AB", 
       "city": "City 1" 
      }, { 
       "addressid": "2", 
       "street": "Street 2", 
       "postcode": "5678 CD", 
       "city": "City 2" 
      }] 
     } 
    } 
} 

и положить его в файл, следующий сценарий будет получить, что вы хотите. Обратите внимание, что вам нужно перейти вниз по структуре, чтобы нести вдоль элементов более высокого уровня, и как только вы столкнулись с массивом, вы получите CROSS APPLY EXPLODE, если вам нужны только те, у которых есть массив, или OUTER APPLY EXPLODE, если вам нужны строки с отсутствующими массивами.

DECLARE @input string = @"/temp/stackoverflow.json"; 

REFERENCE ASSEMBLY [Newtonsoft.Json]; 
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats]; 

@json = 
EXTRACT relationid int, 
     name string, 
     addresses string 
    FROM @input 
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("relation"); 

@relation = 
SELECT relationid, 
     name, 
     Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(addresses)["address"] AS address_array 
FROM @json; 

@addresses = 
SELECT relationid, 
     name, 
     Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(address) AS address 
FROM @relation 
    CROSS APPLY 
     EXPLODE (Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(address_array).Values) AS A(address); 

@result = 
SELECT relationid, 
     name, 
     address["addressid"]AS addressid, 
     address["street"]AS street, 
     address["postcode"]AS postcode, 
     address["city"]AS city 
FROM @addresses; 

OUTPUT @result 
TO "https://stackoverflow.com/users/temp/st_out.csv" 
USING Outputters.Csv(); 

 Смежные вопросы

  • Нет связанных вопросов^_^