目录
- 1 应用场景
- 2 处理方式
- 3 JSON函数:get_json_object
- 3.1 功能
- 3.2 语法
- 3.3 使用
- 4 JSON函数:json_tuple
- 4.1 功能
- 4.2 语法
- 4.3 使用
- 5 JSONSerde
- 5.1 功能
- 5.2 使用
- 6 总结
1 应用场景
JSON数据格式是数据存储及数据处理中最常见的结构化数据格式之一,很多场景下公司都会将数据以JSON格式存储在HDFS中,当构建数据仓库时,需要对JSON格式的数据进行处理和分析,那么就需要在Hive中对JSON格式的数据进行解析读取。
例如,当前我们JSON格式的数据如下:
每条数据都以JSON形式存在,每条数据中都包含4个字段,分别为设备名称【device】、设备类型【deviceType】、信号强度【signal】和信号发送时间【time】,现在我们需要将这四个字段解析出来,在Hive表中以每一列的形式存储,最终得到以下Hive表:
2 处理方式
Hive中为了实现JSON格式的数据解析,提供了两种解析JSON数据的方式,在实际工作场景下,可以根据不同数据,不同的需求来选择合适的方式对JSON格式数据进行处理。
➢ 方式一:使用JSON函数进行处理
Hive中提供了两个专门用于解析JSON字符串的函数:get_json_object、json_tuple,这两个函数都可以实现将JSON数据中的每个字段独立解析出来,构建成表。
➢ 方式二:使用Hive内置的JSON Serde加载数据
Hive中除了提供JSON的解析函数以外,还提供了一种专门用于加载JSON文件的Serde来实现对JSON文件中数据的解析,在创建表时指定Serde,加载文件到表中,会自动解析为对应的表格式。
3 JSON函数:get_json_object
3.1 功能
用于解析JSON字符串,可以从JSON字符串中返回指定的某个对象列的值
3.2 语法
➢ 语法
get_json_object(json_txt, path) - Extract a json object from path
➢ 参数
➢ 第一个参数:指定要解析的JSON字符串
➢ 第二个参数:指定要返回的字段,通过$.columnName的方式来指定path
➢ 特点:每次只能返回JSON对象中一列的值
3.3 使用
➢ 创建表
--切换数据库
use db_function;
--创建表
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;
➢ 获取设备名称字段
select
json,
get_json_object(json,"$.device") as device
from tb_json_test1;
➢ 获取设备名称及信号强度字段
select
--获取设备名称
get_json_object(json,"$.device") as device,
--获取设备信号强度
get_json_object(json,"$.signal") as signal
from tb_json_test1;
➢ 实现需求
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;
4 JSON函数:json_tuple
4.1 功能
用于实现JSON字符串的解析,可以通过指定多个参数来解析JSON返回多列的值
4.2 语法
➢ 语法
json_tuple(jsonStr, p1, p2, ..., pn)
like get_json_object, but it takes multiple names and return a tuple
➢ 参数
➢ 第一个参数:指定要解析的JSON字符串
➢ 第二个参数:指定要返回的第1个字段
➢……
➢ 第N+1个参数:指定要返回的第N个字段
➢ 特点
➢ 功能类似于get_json_object,但是可以调用一次返回多列的值。属于UDTF类型函数
➢ 返回的每一列都是字符串类型
➢ 一般搭配lateral view使用
4.3 使用
➢ 获取设备名称及信号强度字段
select
--返回设备名称及信号强度
json_tuple(json,"device","signal") as (device,signal)
from tb_json_test1;
➢ 实现需求,单独使用
select
–解析所有字段
json_tuple(json,“device”,“deviceType”,“signal”,“time”) as (device,deviceType,signal,stime)
from tb_json_test1;
➢ 实现需求,搭配侧视图
select
json,device,deviceType,signal,stime
from tb_json_test1
lateral view json_tuple(json,“device”,“deviceType”,“signal”,“time”) b
as device,deviceType,signal,stime;
5 JSONSerde
5.1 功能
上述解析JSON的过程中是将数据作为一个JSON字符串加载到表中,再通过JSON解析函数对JSON字符串进行解析,灵活性比较高,但是对于如果整个文件就是一个JSON文件,在使用起来就相对比较麻烦。Hive中为了简化对于JSON文件的处理,内置了一种专门用于解析JSON文件的Serde解析器,在创建表时,只要指定使用JSONSerde解析表的文件,就会自动将JSON文件中的每一列进行解析。
5.2 使用
➢ 创建表
--切换数据库
use db_function;
--创建表
create table tb_json_test2 (
device string,
deviceType string,
signal double,
`time` string
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;
➢ 加载数据
load data local inpath ‘/export/data/device.json’ into table tb_json_test2;
➢ 查询数据
select * from tb_json_test2;
6 总结
不论是Hive中的JSON函数还是自带的JSONSerde,都可以实现对于JSON数据的解析,工作中一般根据数据格式以及对应的需求来实现解析。如果数据中每一行只有个别字段是JSON格式字符串,就可以使用JSON函数来实现处理,但是如果数据加载的文件整体就是JSON文件,每一行数据就是一个JSON数据,那么建议直接使用JSONSerde来实现处理最为方便。