2016-08-17 10 views
1

У меня есть этот JSON файл в озере данных, который выглядит следующим образом:данные USql вызовов в многомерном массиве JSON

{ 
"id":"398507", 
"contenttype":"POST", 
"posttype":"post", 
"uri":"http://twitter.com/etc", 
"title":null, 
"profile":{ 
    "@class":"PublisherV2_0", 
    "name":"Company", 
    "id":"2163171", 
    "profileIcon":"https://pbs.twimg.com/image", 
    "profileLocation":{ 
     "@class":"DocumentLocation", 
     "locality":"Toronto", 
     "adminDistrict":"ON", 
     "countryRegion":"Canada", 
     "coordinates":{ 
     "latitude":43.7217, 
     "longitude":-31.432}, 
     "quadKey":"000000000000000"}, 
     "displayName":"Name", 
     "externalId":"00000000000"}, 
    "source":{ 
     "name":"blogs", 
     "id":"18", 
     "param":"Twitter"}, 
    "content":{ 
     "text":"Description of post"}, 
     "language":{ 
      "name":"English", 
      "code":"en"}, 
     "abstracttext":"More Text and links", 
     "score":{} 
    } 
} 

для вызова данных в мое приложение, я должен включить JSON в строку используя этот код:

DECLARE @input string = @"/MSEStream/{*}.json"; 

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


@allposts = 
EXTRACT 
    jsonString string 
FROM @input 
USING Extractors.Text(delimiter:'\b', quoting:true); 

@extractedrows = SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(jsonString) AS er FROM @allposts; 


@result = 
SELECT er["id"] AS postID, 
     er["contenttype"] AS contentType, 
     er["posttype"] AS postType, 
     er["uri"] AS uri, 
     er["title"] AS Title, 
     er["acquisitiondate"] AS acquisitionDate, 
     er["modificationdate"] AS modificationDate, 
     er["publicationdate"] AS publicationDate, 
     er["profile"] AS profile 
FROM @extractedrows; 

OUTPUT @result 
TO "/ProcessedQueries/all_posts.csv" 
USING Outputters.Csv(); 

Это выводить JSON в CSV-файл, который читается и когда я загрузить файл все данные отображаются правильно. Моя проблема в том, когда мне нужно получить данные внутри профиля. Поскольку JSON теперь является строкой, я не могу извлечь какой-либо из этих данных и поместить ее в переменную, которая будет использоваться. Есть какой-либо способ сделать это? или мне нужно изучить другие параметры чтения данных?

ответ

2

Вы можете использовать JsonTuple в строке профиля, чтобы дополнительно извлечь нужные свойства. Пример кода U-SQL для обработки вложенного Json приведен в этой ссылке - https://github.com/Azure/usql/blob/master/Examples/JsonSample/JsonSample/NestedJsonParsing.usql.

Вы можете использовать JsonTuple на колонке профиля для дальнейшего извлечения конкретных узлов

Э.Г. используйте JsonTuple, чтобы получить все дочерние узлы узла профиля и извлечь определенные значения, например, как вы это делали в своем коде.

@childnodesofprofile = 
SELECT 
    Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(profile) AS childnodes_map 
FROM @result; 

@values = 
SELECT 
    childnodes_map["name"] AS name, 
    childnodes_map["id"] AS id 
FROM @result; 

В качестве альтернативы, если вы заинтересованы в конкретных значениях, можно также передать paramters функции JsonTuple, чтобы получить конкретные узлы, которые вы хотите. Приведенный ниже код получает узел локальности из рекурсивно вложенных узлов (как описано в «$ .. значение» построить.

@locality = 
SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(profile, "$..locality").Values AS locality 
FROM @result; 

Других поддерживаемых конструкций по JsonTuple

JsonTuple(json, "id", "name")    // field names   
    JsonTuple(json, "$.address.zip")   // nested fields   
    JsonTuple(json, "$..address")    // recursive children 
    JsonTuple(json, "$[?(@.id > 1)].id")  // path expression  
    JsonTuple(json)       // all children 

Надеется, что это помогает.

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

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