关于json处理的系列文章:
大数据-MapReduce-关于Json数据格式的数据的处理与练习-CSDN博客
大数据-Spark-关于Json数据格式的数据的处理与练习-CSDN博客
一、JSON解析
--测试数据
{"k1":"v31", "k2": 300, "a1": [{"k1":"v41", "k2": 400}, 1, "a", 3.14]}
{"k1":"v32", "k2": 400, "a1": [{"k1":"v41", "k2": 400}, 2, "a", 4.14],"a2":{"k3":"v33", "k4": 200,"a2": [{"k1":"v41", "k2": 400}, 2, "a", 4.14]}}
{"k1":"v33", "k2": 500, "a1": [{"k1":"v41", "k2": 400}, 3, "a", 5.14],"a2":{"k3":"v33", "k4": 200,"a2": [{"k5":"v42", "k6": 600}]}}
{"k1":"v31"}
{"k1":"v31", "k2": 300}
{"k1":"v31", "k2": 200 "a1": []}
json是一种里面存着一对对key,value类型的结构
针对值类型的不同:
1. 简单值:"k1":"v31"
2. 数组:[{"k1":"v41", "k2": 400}, 1, "a", 3.14]
3. 对象:"a2":{"k3":"v33", "k4": 200,"a2": [{"k5":"v42", "k6": 600}]}
1. get_json_object(str,path)
get_json_object
函数用于提取JSON对象中的特定字段。它接受两个参数:JSON字符串和JSON路径。JSON路径用于指定要提取的字段。
取值的时候,指定的'$.k1'==>这样的东西我们称之为json path ,json的路径 path :第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组; 如果输入的json字符串无效,那么返回NULL。
-
. : 用于解析层级结构关系
-
[]: 用于解析数组或者Map中的元素
练习1:
-- {"k1":"v31", "k2": 300, "a1": [{"k1":"v41", "k2": 400}, 1, "a", 3.14]}
-- 假设我们有一个名为 json_data 的表,包含一个 json_column 列,存储了这个 JSON 数据。
-- 提取顶层字段
SELECT
get_json_object(json_column, '$.k1') AS k1,
get_json_object(json_column, '$.k2') AS k2
FROM
json_data;
-- 提取嵌套数组中的元素
SELECT
get_json_object(json_column, '$.a1[0].k1') AS a1_k1,
get_json_object(json_column, '$.a1[0].k2') AS a1_k2
FROM
json_data;
-- 提取数组中的其他元素
SELECT
get_json_object(json_column, '$.a1[1]') AS a1_1,
get_json_object(json_column, '$.a1[2]') AS a1_2,
get_json_object(json_column, '$.a1[3]') AS a1_3
FROM
json_data;
注意 : 每次只能返回一个数据项,若想需要解析多个列,则需要多次调用 get_json_object 函数。这个需要注意,这个是相对于get_json_tuple 函数而言的
2. json_tuple
json_tuple
函数用于将JSON对象解析成多个列。它接受两个参数:JSON字符串和要解析的字段名称列表。
它的语法如下:
SELECT json_tuple(json_string, 'field1', 'field2', ...) AS (field1_alias, field2_alias, ...);
练习1:
create table test_json(
str string
) ;
load data local inpath '/data/movie.txt' into table test_json
select json_tuple(str , 'movie' , 'rate' , 'timeStamp' , 'uid') as (mid , rate , ct , uid) from test_json
create table test_json(
movie string,
rate string,
`TIMESTAMP` string,
`uid` string
)
row format Serde 'org.apache.hadoop.hive.hcatalog.data.JsonSerDe';
select movie , rate , timestamp , uid from test_json;