目录



1 应用场景

JSON数据格式是数据存储及数据处理中最常见的结构化数据格式之一,很多场景下公司都会将数据以JSON格式存储在HDFS中,当构建数据仓库时,需要对JSON格式的数据进行处理和分析,那么就需要在Hive中对JSON格式的数据进行解析读取。

例如,当前我们JSON格式的数据如下:

大数据Hive JSON数据处理_hive

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

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;

大数据Hive JSON数据处理_big data_03

➢ 获取设备名称字段

select
json,
get_json_object(json,"$.device") as device
from tb_json_test1;

大数据Hive JSON数据处理_hive_04

➢ 获取设备名称及信号强度字段

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

大数据Hive JSON数据处理_hive_05

➢ 实现需求

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;

大数据Hive JSON数据处理_json_06

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;

大数据Hive JSON数据处理_数据_07

➢ 实现需求,单独使用

select

–解析所有字段

json_tuple(json,“device”,“deviceType”,“signal”,“time”) as (device,deviceType,signal,stime)

from tb_json_test1;

大数据Hive JSON数据处理_json_08

➢ 实现需求,搭配侧视图

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;

大数据Hive JSON数据处理_big data_09

6 总结

不论是Hive中的JSON函数还是自带的JSONSerde,都可以实现对于JSON数据的解析,工作中一般根据数据格式以及对应的需求来实现解析。如果数据中每一行只有个别字段是JSON格式字符串,就可以使用JSON函数来实现处理,但是如果数据加载的文件整体就是JSON文件,每一行数据就是一个JSON数据,那么建议直接使用JSONSerde来实现处理最为方便。