文章目录
JSON格式的数据如下,JSON格式对引号要求比较高,如果key或者value是字符串类型的,只能使用双引号引起来。
json
{"key":"value", "key":"value", "key":"value", "key":"value", ...}

每条数据都以JSON形式存在,每条数据中都包含4个字段,分别为设备名称【device】、设备类型【deviceType】、信号强度【signal】和信号发送时间【time】,现在需要将这四个字段解析出来,在Hive表中以每一列的形式存储,最终得到以下Hive表:

1.JSON函数:get_json_object
get_json_object函数用于解析json字符串,可以从json字符串中返回指定的某个对象列的值,每次只能返回json对象中一列的值。
powershell
# 语法:
get_json_object(json_txt, path)
# 第一个参数json_txt:指定要解析的JSON字符串
# 第二个参数path:指定要返回的字段,通过$.columnName的方式来指定path
sql
--创建表
create table tb_json_test1 (
json string
);
--加载数据
load data local inpath '/export/data/device.json' into table tb_json_test1;
select * from tb_json_test1;

sql
# 获取设备名称字段
select
json,
get_json_object(json,"$.device") as device
from tb_json_test1;

sql
# 获取设备名称及信号强度字段
select
--获取设备名称
get_json_object(json,"$.device") as device,
--获取设备信号强度
get_json_object(json,"$.signal") as signal
from tb_json_test1;

sql
select
--获取设备名称
get_json_object(json,"$.device") as device,
--获取设备类型
get_json_object(json,"$.deviceType") as deviceType,
--获取设备信号强度
get_json_object(json,"$.signal") as signal,
--获取时间
get_json_object(json,"$.time") as stime
from tb_json_test1;

2.JSON函数:json_tuple
json_tuple函数用于实现JSON字符串的解析,可以通过指定多个参数来解析JSON返回多列的值。功能类似于get_json_object,但是可以调用一次返回多列的值,属于UDTF类型函数,返回的每一列都是字符串类型,还可以搭配lateral view一起使用。
powershell
# 语法:
json_tuple(jsonStr, p1, p2, ..., pn)
第一个参数:指定要解析的JSON字符串
第二个参数:指定要返回的第1个字段
...
第N+1个参数:指定要返回的第N个字段
sql
# 获取设备名称及信号强度字段
select
--返回设备名称及信号强度
json_tuple(json,"device","signal") as (device,signal)
from tb_json_test1;

sql
select
--解析所有字段
json_tuple(json,"device","deviceType","signal","time") as (device,deviceType,signal,stime)
from tb_json_test1;
