Hive - Json 解析

关于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;

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值