USql 在多维 JSON 数组中调用数据
USql Call data in multidimensional JSON array
我在数据湖中有这个 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 现在是一个字符串,所以我似乎无法提取任何数据并将其放入变量中以供使用。有什么办法吗?还是我需要研究其他读取数据的选项?
您可以在配置文件字符串上使用 Json 元组来进一步提取您想要的特定属性。此 link - https://github.com/Azure/usql/blob/master/Examples/JsonSample/JsonSample/NestedJsonParsing.usql.
中提供了处理嵌套 Json 的 U-SQL 代码示例
您可以在配置文件列上使用Json元组来进一步提取特定节点
例如使用 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;
或者,如果您对特定值感兴趣,您也可以将参数传递给 JsonTuple 函数以获取您想要的特定节点。下面的代码从递归嵌套的节点中获取位置节点(如“$..value”结构所述。
@locality =
SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(profile, "$..locality").Values AS locality
FROM @result;
Json元组
支持的其他结构
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
希望这对您有所帮助。
我在数据湖中有这个 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 现在是一个字符串,所以我似乎无法提取任何数据并将其放入变量中以供使用。有什么办法吗?还是我需要研究其他读取数据的选项?
您可以在配置文件字符串上使用 Json 元组来进一步提取您想要的特定属性。此 link - https://github.com/Azure/usql/blob/master/Examples/JsonSample/JsonSample/NestedJsonParsing.usql.
中提供了处理嵌套 Json 的 U-SQL 代码示例您可以在配置文件列上使用Json元组来进一步提取特定节点
例如使用 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;
或者,如果您对特定值感兴趣,您也可以将参数传递给 JsonTuple 函数以获取您想要的特定节点。下面的代码从递归嵌套的节点中获取位置节点(如“$..value”结构所述。
@locality =
SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(profile, "$..locality").Values AS locality
FROM @result;
Json元组
支持的其他结构 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
希望这对您有所帮助。