JSON表中有破损数据导致Hive查询异常
用户问题
在Hive客户端查询JSON数据,JSON表中有破损数据导致查询异常:
- 在Hive客户端上使用默认开源的JSON序列化建表语句创建表:
create external table if not exists test (
name string
)
row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
stored as textfile
location 'hdfs://hacluster/user/hive/warehouse/database/table/jsondata';
- 查询表出现异常。
该章节内容适用于MRS 1.9.2之后版本。
原因分析
使用默认开源的JSON序列化语句创建Hive表无法将表中JSON破损数据过滤掉,导致查询异常。
处理步骤
- 下载json-serde-1.3.8-jar-with-dependencies.jar到本地,并将该Jar上传到所有的HiveServer所在节点。
- 以客户端安装用户,登录1上传了Jar包并且安装了Hive和HDFS客户端的节点。
- 执行以下命令认证用户。
cd 客户端安装目录
source bigdata_env
kinit 具有Hive管理员权限的用户(未开启Kerberos认证的集群跳过此操作)
- 执行以下命令在HDFS上创建Jar包存放目录。
hdfs dfs -mkdir Jar包存放在hdfs中的路径
- 执行以下命令将2的Jar上传至HDFS中。
hdfs dfs -put Jar包存放路径 Jar包存放在hdfs中的路径
- 执行以下命令让Hive在执行命令行任务时加载指定Jar包。
beeline
set role admin;(未开启Kerberos认证的集群跳过此操作)
add jar Jar包存放在hdfs中的路径;
- 执行以下命令重新创建表:
create external table if not exists test (
name string
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
stored as textfile
location 'hdfs://hacluster/user/hive/warehouse/database/table/jsondata';
- 执行以下命令修改表属性忽略破损的JSON数据:
ALTER TABLE test SET SERDEPROPERTIES( "ignore.malformed.json" = "true");
设置该属性后,查询表时若表中有破损的JSON数据默认显示为“NULL”。
- 执行以下命令查询表数据:
select * from test;
数据查询成功则表示已忽略破损的JSON数据,其中,破损的JSON数据显示为“NULL”: