文档首页/ MapReduce服务 MRS/ 故障排除/ 使用Hive/ JSON表中有破损数据导致Hive查询异常
更新时间:2022-12-09 GMT+08:00

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. 查询表出现异常。

该章节内容适用于MRS 1.9.2之后版本。

原因分析

使用默认开源的JSON序列化语句创建Hive表无法将表中JSON破损数据过滤掉,导致查询异常。

处理步骤

  1. 下载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”: