
# JSON表中有破损数据导致Hive查询异常
#### 用户问题
在Hive客户端查询JSON数据，JSON表中有破损数据导致查询异常：
1. 在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* **';**
   
2. 查询表出现异常。 ![](https://support.huaweicloud.com/trouble-mrs/zh-cn_image_0000001427390705.png "点击放大")
   
![](https://support.huaweicloud.com/trouble-mrs/public_sys-resources/note_3.0-zh-cn.png)
该章节内容适用于MRS 1.9.2之后版本。
#### 原因分析
使用默认开源的JSON序列化语句创建Hive表无法将表中JSON破损数据过滤掉，导致查询异常。
#### 处理步骤
1. 下载[json-serde-1.3.8-jar-with-dependencies.jar](https://www.congiu.net/hive-json-serde/1.3.8/hdp23/json-serde-1.3.8-jar-with-dependencies.jar)到本地，并将该Jar上传到所有的HiveServer所在节点。
2. 以客户端安装用户，登录[1]上传了Jar包并且安装了Hive和HDFS客户端的节点。
3. 执行以下命令认证用户。 
   **cd** *客户端安装目录*
   **source bigdata_env**
   **kinit** *具有Hive管理员权限的用户*（未开启Kerberos认证的集群跳过此操作）
   
   
4. 执行以下命令在HDFS上创建Jar包存放目录。 
   **hdfs dfs -mkdir** *Jar包存放在hdfs中的路径*
   
   
5. 执行以下命令将[2]的Jar上传至HDFS中。
   
   **hdfs dfs -put** *Jar包存放路径* *Jar包存放在hdfs中的路径*
   
   
6. 执行以下命令让Hive在执行命令行任务时加载指定Jar包。 
   **beeline**
   **set role admin;**（未开启Kerberos认证的集群跳过此操作）
   **add jar** *Jar包存放在hdfs中的路径*;
   
   
7. 执行以下命令重新创建表： 
   **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* **';**
   
   
8. 执行以下命令修改表属性忽略破损的JSON数据： 
   **ALTER TABLE** *test* **SET SERDEPROPERTIES( "ignore.malformed.json" = "true")** **;**
   设置该属性后，查询表时若表中有破损的JSON数据默认显示为"NULL"。
   
   
9. 执行以下命令查询表数据： 
   **select \* from** *test* **;**
   数据查询成功则表示已忽略破损的JSON数据，其中，破损的JSON数据显示为"NULL"：
   ![](https://support.huaweicloud.com/trouble-mrs/zh-cn_image_0000001447154993.png "点击放大")
   
   
 
