【问题标题】:using JSON-SerDe in Hive tables在 Hive 表中使用 JSON-SerDe
【发布时间】:2013-02-05 10:57:02
【问题描述】:

我正在从下面的链接尝试 JSON-SerDe http://code.google.com/p/hive-json-serde/wiki/GettingStarted。

         CREATE TABLE my_table (field1 string, field2 int, 
                                     field3 string, field4 double)
         ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde' ;

我已将 Json-SerDe jar 添加为

          ADD JAR /path-to/hive-json-serde.jar;

并将数据加载为

LOAD DATA LOCAL INPATH  '/home/hduser/pradi/Test.json' INTO TABLE my_table;

并成功加载数据。

但是当查询数据为

从 my_table 中选择 *;

我从表中只得到一行

data1 100 更多数据1 123.001

Test.json 包含

{"field1":"data1","field2":100,"field3":"more data1","field4":123.001} 

{"field1":"data2","field2":200,"field3":"more data2","field4":123.002} 

{"field1":"data3","field2":300,"field3":"more data3","field4":123.003} 

{"field1":"data4","field2":400,"field3":"more data4","field4":123.004}

问题出在哪里?为什么当我查询表格时只有一行而不是 4 行。而在 /user/hive/warehouse/my_table 中包含所有 4 行!!


hive> add jar /home/hduser/pradeep/hive-json-serde-0.2.jar;
Added /home/hduser/pradeep/hive-json-serde-0.2.jar to class path
Added resource: /home/hduser/pradeep/hive-json-serde-0.2.jar

hive> CREATE EXTERNAL TABLE my_table (field1 string, field2 int,
>                                 field3 string, field4 double)
> ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde'
> WITH SERDEPROPERTIES (
>   "field1"="$.field1",
>   "field2"="$.field2",
>   "field3"="$.field3",
>   "field4"="$.field4"
> );
OK
Time taken: 0.088 seconds

hive> LOAD DATA LOCAL INPATH  '/home/hduser/pradi/test.json' INTO TABLE my_table;
Copying data from file:/home/hduser/pradi/test.json
Copying file: file:/home/hduser/pradi/test.json
Loading data to table default.my_table
OK
Time taken: 0.426 seconds

hive> select * from my_table;
OK
data1   100     more data1      123.001
Time taken: 0.17 seconds

我已经发布了 test.json 文件的内容。所以你可以看到查询只产生一行

data1   100     more data1      123.001

我已将 json 文件更改为包含

的employee.json

{ “名字”:“迈克”, "lastName" : "切佩斯基", “员工编号”:1840192 }

也改变了表格,但是当我查询表格时它显示一个空值

hive> add jar /home/hduser/pradi/hive-json-serde-0.2.jar;
Added /home/hduser/pradi/hive-json-serde-0.2.jar to class path
Added resource: /home/hduser/pradi/hive-json-serde-0.2.jar

hive> create EXTERNAL table employees_json (firstName string, lastName string,        employeeNumber int )
> ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde';
OK
Time taken: 0.297 seconds


hive> load data local inpath '/home/hduser/pradi/employees.json' into table     employees_json;
Copying data from file:/home/hduser/pradi/employees.json
Copying file: file:/home/hduser/pradi/employees.json
Loading data to table default.employees_json
OK
Time taken: 0.293 seconds


 hive>select * from employees_json;
  OK
  NULL    NULL    NULL
  NULL    NULL    NULL
  NULL    NULL    NULL
  NULL    NULL    NULL
  NULL    NULL    NULL
  NULL    NULL    NULL
Time taken: 0.194 seconds

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    如果有疑问,如果没有日志,有点难以判断发生了什么(请参阅Getting Started)。只是一个快速的想法 - 你可以试试它是否适用于WITH SERDEPROPERTIESas so:

    CREATE EXTERNAL TABLE my_table (field1 string, field2 int, 
                                    field3 string, field4 double)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde'
    WITH SERDEPROPERTIES (
      "field1"="$.field1",
      "field2"="$.field2",
      "field3"="$.field3",
      "field4"="$.field4" 
    );
    

    还有一个fork,您可能想试试 ThinkBigAnalytics。

    更新:原来 Test.json 中的输入是无效的 JSON,因此记录被折叠。

    更多详情,请参阅答案https://stackoverflow.com/a/11707993/396567。

    【讨论】:

    • 嗨,Michael,即使在创建表之后,也存在同样的问题,正如您所说的 WITH SERDEPROPERTIES。我检查了日志,但无法从这些日志中找出任何内容。
    • 是的,和你上面写的一样。但是创建表和创建外部表有什么区别呢?而且当我删除这个表(CREATE EXTERNAL)时,它不会从 HDFS 中删除。
    • EXTERNAL 表示 Hive 不拥有数据,但表的元数据在 DROP 时被删除。您可以使用查询的完整输出更新您的帖子吗?
    • 嗨迈克尔,我已经发布了查询的完整输出。
    • 天啊,我非常关注 Hive,直到现在才发现您的输入无效。不能在 JSON 中重复键,这就是为什么在他加载阶段记录被折叠的原因。首先检查诸如 jsonlint.com 之类的 linter,以确保它是有效的 JSON。
    【解决方案2】:
    1. 首先,您必须在 http://jsonlint.com/ 上验证您的 json 文件 之后,将您的文件设为每行一行并删除 [ ]。行尾的逗号是强制性的。

      [{"field1":"data1","field2":100,"field3":"更多数据1","field4":123.001}, {"field1":"data2","field2":200,"field3":"更多数据2","field4":123.002}, {"field1":"data3","field2":300,"field3":"更多数据3","field4":123.003}, {"field1":"data4","field2":400,"field3":"more data4","field4":123.004}]

    2. 在我的测试中,我从 hadoop cluster 添加了 hive-json-serde-0.2.jar,我认为 hive-json-serde-0.1.jar 应该没问题。

      添加 JAR hive-json-serde-0.2.jar;

    3. 创建你的表

      CREATE TABLE my_table (field1 string, field2 int, field3 string, field4 double) 行格式 SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde' ;

    4. 加载你的 Json 数据文件,这里我从 hadoop 集群而不是本地加载它

      将数据输入路径“Test2.json”加载到表 my_table 中;

    My test

    【讨论】:

    • 表不是由您的代码创建的。它抛出一个空指针异常
    【解决方案3】:

    用于json解析 基于 cwiki/confluence 我们需要遵循一些步骤

    1. 需要下载hive-hcatalog-core.jar

    2. hive> 添加 jar /path/hive-hcatalog-core.jar

    3. create table tablename(colname1 datatype,.....) rowformatserde'org.apache.hive.hcatalog.data.JsonSerDe' 存储为 ORCFILE;

    4. 创建表中的colname 和test.json 中的colname 必须相同,否则将显示空值 希望对你有帮助

    【讨论】:

      【解决方案4】:

      我解决了类似的问题 -

      1. 我从 - [http://www.congiu.net/hive-json-serde/1.3.8/hdp23/json-serde-1.3.8-jar-with-dependencies.jar]

      2. 在 Hive CLI 中运行命令 - 添加 jar /path/to/jar

      3. 创建的表使用 -
      create table messages (
          id int,
          creation_date string,
          text string,
          loggedInUser STRUCT<id:INT, name: STRING>
      )
      row format serde "org.openx.data.jsonserde.JsonSerDe";
      
      1. 这是我的 JSON 数据 -
      {"id": 1,"creation_date": "2020-03-01","text": "I am on cotroller","loggedInUser":{"id":1,"name":"API"}}
      {"id": 2,"creation_date": "2020-04-01","text": "I am on service","loggedInUser":{"id":1,"name":"API"}}
      
      1. 使用 -
      2. 在表中加载数据
      LOAD DATA LOCAL INPATH '${env:HOME}/path-to-json'
      OVERWRITE INTO TABLE messages;
      
      1. select * from messages;
      1   2020-03-01    I am on cotroller   {"id":1,"name:"API"}
      2   2020-04-01    I am on service     {"id":1,"name:"API"}
      

      【讨论】:

        猜你喜欢
        • 2019-09-01
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 2016-02-28
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多