用于一个标准的JSON字符串中,按照输入的一组键(key1,key2,...)
抽取各个键指定的字符串。
命令格式
string json_tuple(string <json>, string <key1>, string <key2>,...)
参数说明
json:必填。STRING类型,标准的JSON格式字符串。
key:必填。STRING类型,用于描述在JSON中的
path
,一次可输入多个,不能以美元符号($)开头。MaxCompute支持用.
或['']
这两种字符解析JSON,当JSON的Key本身包含.
时,可以用['']
来替代。
返回值说明
返回STRING类型。
说明
如果JSON为空或者为非法的JSON格式,返回NULL。
如果键Key为空或者不合法(JSON中不存在)返回NULL。
如果JSON合法,键Key也存在,则返回对应字符串。
支持包含中文的JSON数据解析。
支持多层嵌套的JSON数据解析。
支持包含多重嵌套的数组的JSON数据解析。
解析行为和设置了
set odps.sql.udf.getjsonobj.new=true;
后的GET_JSON_OBJECT的行为保持一致。在需要对同一个JSON字符串多次解析的情况下,相比于多次调用GET_JSON_OBJECT,JSON_TUPLE可以一次输入多个Key,且JSON字符串只被解析一次,效率更高。JSON_TUPLE是UDTF,在需要选取其他列时应配合Lateral View使用。
使用示例
--创建一张表school。
create table school (id string, json string);
--向表中插入数据。
insert into school (id, json) values ("1", "{
\"school\": \"湖畔大学\", \"地址\":\"杭州\", \"SchoolRank\": \"00\",
\"Class1\":{\"Student\":[{\"studentId\":1,\"scoreRankIn3Year\":[1,2,[3,2,6]]},
{\"studentId\":2,\"scoreRankIn3Year\":[2,3,[4,3,1]]}]}}");
示例1:提取JSON对象信息。命令示例如下。
select json_tuple(school.json,"SchoolRank","Class1") as (item0, item1) from school; --等效于如下语句。 select get_json_object(school.json,"$.SchoolRank") item0,get_json_object(school.json,"$.Class1") item1 from school; --返回结果如下。 +-------+-------+ | item0 | item1 | +-------+-------+ | 00 | {"Student":[{"studentId":1,"scoreRankIn3Year":[1,2,[3,2,6]]},{"studentId":2,"scoreRankIn3Year":[2,3,[4,3,1]]}]} | +-------+-------+
示例2:使用
['']
提取JSON对象信息。命令示例如下。select json_tuple(school.json,"school","['Class1'].Student") as (item0, item2) from school where id=1; --返回结果如下。 +-------+-------+ | item0 | item2 | +-------+-------+ | 湖畔大学 | [{"studentId":1,"scoreRankIn3Year":[1,2,[3,2,6]]},{"studentId":2,"scoreRankIn3Year":[2,3,[4,3,1]]}] |
示例3:支持解析包含中文的JSON数据。命令示例如下。
select json_tuple(school.json,"school","地址") as (item0,item1) from school; --返回结果如下。 +-------+-------+ | item0 | item1 | +-------+-------+ | 湖畔大学 | 杭州 | +-------+-------+
示例4:支持解析多层嵌套的JSON数据。命令示例如下。
select sc.Id, q.item0, q.item1 from school sc lateral view json_tuple(sc.json,"Class1.Student[*].studentId","Class1.Student[0].scoreRankIn3Year") q as item0,item1; --返回结果如下。 +------------+-------+-------+ | id | item0 | item1 | +------------+-------+-------+ | 1 | [1,2] | [1,2,[3,2,6]] | +------------+-------+-------+
示例5:支持解析包含多重嵌套数组的JSON数据。命令示例如下。
select sc.Id, q.item0, q.item1 from school sc lateral view json_tuple(sc.json,"Class1.Student[0].scoreRankIn3Year[2]","Class1.Student[0].scoreRankIn3Year[2][1]") q as item0,item1; --返回结果如下。 +------------+-------+-------+ | id | item0 | item1 | +------------+-------+-------+ | 1 | [3,2,6] | 2 | +------------+-------+-------+
相关函数
JSON_TUPLE函数属于复杂类型函数或字符串函数。
文档内容是否对您有帮助?