作者:余枫

1

文档编写目的

在使用Hive处理数据的过程中会遇到各种各样的数据源,其中较为常见的是JSON格式的数据,Hive无法直接处理JSON格式的数据,需要依赖于JSONSerDe。SerDe即序列化和反序列化,JSONSerDe基本思想是使用json.org的JSON库,使用这个库可以读取一行数据并解析为JSONObject,然后解析到Hive中的数据行。因此JSON文件的每行必须是一个完整的JSON,一个JSON不能跨越多行。本文档介绍的是JsonSerDe,该库的地址为:https://github.com/rcongiu/Hive-JSON-Serde。它的特点如下:

  • 能够读取JSON格式的数据

  • 支持JSON数组和Map

  • 支持嵌套数据结构

  • 支持CDH

  • 支持多个版本的Hadoop

下面会进行一些JSON数据的读取测试,介绍如何使用Hive来处理JSON格式的数据。

  • 操作系统RedHat7.2

  • CM和CDH版本为6.2

  • 使用root用户进行操作

  • 集群正常运行

2

操作过程

1.准备json格式的数据文件如下:

2.将文件上传到HDFS

3.下载json-serde包,下载地址如下:

http://www.congiu.net/hive-json-serde/1.3.7/cdh5/json-serde-1.3.7-jar-with-dependencies.jar

4.将下载好的包移动HiveServer2所在节点的hive服务的auxlib目录下

5.在Hive中建外部表

create external table test_json_data (reportID string,reportCreditBasicList array<structstring>> )row format serde 'org.openx.data.jsonserde.JsonSerDe'stored as textfilelocation '/user/hive/json_data';

6.执行select操作

select * from test_json_data;

select b.basiclist.Col1 from test_json_data t LATERAL VIEW explode(t.reportCreditBasicList) b as basiclist;

select count(*) from test_json_data

3

其他功能验证

3.1

查询复杂字段

1. 准备测试的JSON文件

2. 建表

CREATE TABLE test1 (one boolean,three array<string>,two double,four string )ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'STORED AS TEXTFILE;

3. 加载数据

LOAD DATA LOCAL INPATH '/tmp/data.txt' OVERWRITE INTO TABLE test1;

4. 查看表中数组字段的某个元素

select three[1] from test;

3.2

定义嵌套结构

1.准备测试数据

2.建表

CREATE TABLE test2 (country string,languages array<string>,religions map<string,array<int>>)ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'STORED AS TEXTFILE;

3.加载数据

LOAD DATA LOCAL INPATH '/tmp/data.txt' OVERWRITE INTO TABLE test2

4.查看数据

select * from test2;

select languages[0] from test2;

select religions['catholic'][0] from test2;

3.3

导入格式错误的数据

1.准备错误格式的JSON数据,中间少了个冒号

2.导入数据

导入数据成功

3.查询数据

格式不对,报错了

4.忽略掉格式错误的数据

ALTER TABLE test2 SET SERDEPROPERTIES ( "ignore.malformed.json" = "true");

5.再次查询该表

错误的数据会被空行替代

3.4

映射Hive关键字

有时候,JSON数据中的有Hive的关键字。例如,可能JSON中有一个timestamp的JSON属性,这样的话创建表失败。此SerDek可以使用属性将Hive关键字映射为其他名称的属性。

1.测试数据如下:

2.建表

CREATE TABLE test3 (myfield string, ts string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'WITH SERDEPROPERTIES ( "mapping.ts" = "timestamp" )STORED AS TEXTFILE;

建表成功

3.导入数据并查看

LOAD DATA LOCAL INPATH '/tmp/data.txt' OVERWRITE INTO TABLE test3

查看数据

数据导入成功,与Hive关键字冲突的字段被映射为ts字段,且成功导入了JSON数据中的timestamp属性。

4

测试Apache自带的JsonSerDe

4.1

测试嵌套结构

1.准备测试数据

2.建表并导入数据

CREATE TABLE test1 (one boolean,three array<string>,two double,four string )ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'STORED AS TEXTFILE;

3.查看数据

select three[1] from test1;

4.2

测试导入错误的数据

1.准备测试数据

2.向5.1建的表test1中导入错误的数据并查看

使用与4.3中测试时一样的语句对表结构进行修改

ALTER TABLE test1 SET SERDEPROPERTIES ( "ignore.malformed.json" = "true");

3.再次查询

可以看到依旧报错,Apache自带的JsonSerDe无法忽略错误格式的JSON数据

4.3

映射Hive关键字

1.准备测试数据

2.建表并导入数据

CREATE TABLE test2 (myfield string, ts string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'WITH SERDEPROPERTIES ( "mapping.ts" = "timestamp" )STORED AS TEXTFILE;

3.查看数据

由上图可以看出,字段映射失败,Apache自带的JsonSerDe不支持这种方式。

5

总结

1.Hive处理JSON格式数据本身不支持,需要SerDe即序列化与反序列化来实现JSON数据到Hive中行数据的转换,简单的JSON数据处理Hive自带的JsonSerDe和本文档介绍的JsonSerDe都可以做到。

2.本文档介绍的JsonSerDe与Hive自带的JsonSerDe相比,有更多的功能:

a.在导入的数据中有错误格式的数据时,可以通过设置属性ignore.malformed.json" = "true",忽略错误的数据,用空行来替代,避免了查询过程中Hive会报格式错误导致查询失败。

b.在JSON数据中有Hive关键字时,可以通过将关键字映射到Hive的其他字段来正常的对JSON数据进行查询,例如"mapping.ts" = "timestamp",将JSON中的字段timestamp映射为Hive中建表时定义的字段ts。

3.在与Apache自带的JsonSerDe比较中,首先使用方式上本文档介绍的JsonSerDe在Hive中建表时的方式是create table xxx(col1 string,col2 string)

ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe',而Apache自带的JsonSerDe在Hive中建表时的方式是create table xxx(...)

ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe',Apache自带的JsonSerDe这个类在hive-hcatalog-core-2.1.1.jar中,这个包在CDH的目录/opt/cloudera/parcels/CDH/lib/hive-hcatalog/share/hcatalog/下,在建表时可以直接使用;在功能上经过测试Apache自带的JsonSerDe在碰到某个错误的JSON数据时查询会报错,但是在大量的JSON数据中难免会有一些错误的数据,对于这个问题,就无法使用Apache自带的JsonSerDe,使用文档中介绍的JsonSerDe可以跳过错误的JSON数据,以空来显示,但是不会让整个查询中断,还有一点就是文档中进行测试过的关键字映射,在Apache自带的JsonSerDe中也不支持,功能相对简陋一些。

#读取json某一节点数据_06596.2.0Hive处理JSON格式数据相关推荐

  1. lsdyna如何设置set中的node_list_如何使用Python处理HDF格式数据

    HDF也是一种自描述格式文件,主要用于存储和分发科学数据.气象领域中卫星数据经常使用此格式,比如MODIS,OMI,LIS/OTD等卫星产品.对HDF格式细节感兴趣的可以Google了解一下. 这一次 ...

  2. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  3. netcdf geotiff java_R-NC格式数据转GeoTIFF

    0. 问题导入 目前,很多地理数据均存储为NetCDF格式(下简称NC格式),而往往内含多变量,不方便处理.其中,一种解决思路就是将NC格式文件中的多个变量数据转格式为单变量的GeoTiff文件(图1 ...

  4. 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据

    Socket/TCP 原理这里就不阐述了,网上一搜一大堆,直接上关键代码. [注]iOS 目前有非常著名的第三方库 CocoaAsyncSocket 可以使用,但是我们项目当时做大数据上报要求直接发送 ...

  5. cesium 3dtiles 加载本地数据_记一次Cesium地形数据生成过程

    问题描述 有一小块带高程值的点状数据,需要根据该数据生成Cesium支持的3dtiles数据,在Cesium中显示.经过一周多时间的摸索,终于能够在Cesium中加载成功.现将数据处理流程做个记录,以 ...

  6. VCT空间数据交换格式数据的检测方法研究

    摘要:国土资源信大量的是空间地理信息,由于现买中各GIS系统存储.管理GIS数据的格式各不相同,空间数据交换标准是实现GIS数据共享的必要途径,国土资源部制定了VCT矢量数据交换格式来实现各类国土资源 ...

  7. 【Atlas500】入门到放弃(六)——【DVPP】浅析HFBC格式数据存在的意义

    转载自:https://bbs.huaweicloud.com/blogs/156199, 作者:山人 [摘要] HFBC格式是一种数据压缩格式,是VDEC解码后输出的每一帧数据的格式(Hisi Fr ...

  8. MySQL LOAD DATA INFILE 导入 CSV 格式数据

    主要介绍将 Neo4j 数据库中数据全部导入到 MySQL 数据库中,将 Neo4j 数据导出为 CSV 格式数据,然后再将 CSV 格式数据导入到 mysql 中. 前半部分,即 Neo4j 数据导 ...

  9. delphi读取xml中的内容property name传递参数_python3 Json和XML数据解析

    一.Json数据解析 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json.dumps(): 对数据进行编码. json.loads(): 对数据进行 ...

  10. php 读取 js json格式数据,js读取和解析JSON数据的方法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

最新文章

  1. cannot find module 'cordova-common'
  2. 工具 - 硕思SWF Decompiler5.3Build528 含补丁
  3. Java反射研究(2)
  4. ActiveMQ 消息持久化
  5. 南通工学院计算机97级,2021年南通理工学院录取结果查询网址入口及录取结果公布时间...
  6. 《leetcode》best-time-to-buy-and-sell-stock-i-ii-iii
  7. HDU-5023 线段树染色问题+延时标记
  8. 没有bug队——加贝——Python 55,56
  9. 瑞士Migros Ostschweiz使用RFID和EPCIS优化供应链的可视化
  10. initBinder转换日期格式
  11. 20191013:快速排序1.1
  12. Could not obtain transaction-synchronized Session for current thread原因及解决方案
  13. java中简单的打字游戏_[Java教程]jQuery 写的简单打字游戏
  14. 【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)
  15. CMP是什么意思?谁能解释下?
  16. BTC地址不同格式的区别
  17. 江苏最新建筑施工塔式起重机(建筑特种作业)特种工(塔式起重机)机考题库真题及答案解析
  18. 数学建模--(2.2)拟合模型
  19. 在ppt Excel world中 批量删除超链接
  20. flask python web优品课堂_Python Flask Web网站编程全栈开发系列高清视频教程-价值2499...

热门文章

  1. Oracle监控指标
  2. 2012Google校园招聘笔试题
  3. SQL Server 2005两种快照隔离机制的比较
  4. 蓝桥杯 错误票据——2013年省赛C/C++ A组
  5. Qt warning : 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  6. gitee如何搭建mysql_Gitee的下载安装配置及使用步骤详解
  7. ecshop 邮件模板 html,给ecshop后台增加新的邮件模板
  8. spring cloud config 加密配置
  9. SpringBoot的properteis书写[配置对象类型数据、配置数组类型
  10. php添加开机启动脚本_php-fpm开机自动启动Shell脚本