大数据Hive JSON数据处理


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来实现处理最为方便。

posted @ 2021-09-19 17:32  赵广陆  阅读(260)  评论(0编辑  收藏  举报