你如何用JSON数据制作一个HIVE表?

问题描述 投票:33回答:6

我想用一些JSON数据(嵌套)创建一个Hive表并在其上运行查询?这甚至可能吗?

我已经将JSON文件上传到S3并启动了一个EMR实例,但我不知道在hive控制台中输入什么来将JSON文件作为Hive表?

有没有人有一些示例命令让我开始,我找不到任何有用的谷歌......

json hadoop hive amazon-emr emr
6个回答
23
投票

您需要使用JSON serde才能让Hive将您的JSON映射到表中的列。

一个很好的例子向您展示如何:

http://aws.amazon.com/articles/2855

不幸的是,提供的JSON serde不能很好地处理嵌套的JSON,所以你可能需要展平你的JSON才能使用它。

以下是文章中正确语法的示例:

create external table impressions (
    requestBeginTime string, requestEndTime string, hostname string
  )
  partitioned by (
    dt string
  )
  row format 
    serde 'com.amazon.elasticmapreduce.JsonSerde'
    with serdeproperties ( 
      'paths'='requestBeginTime, requestEndTime, hostname'
    )
  location 's3://my.bucket/' ;

31
投票

实际上没有必要使用JSON SerDe。这里有一篇很棒的博客文章(我不以任何方式与作者联系):

http://pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json/

其中概述了使用内置函数json_tuple在查询时解析json的策略(不是在表定义时):

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-json_tuple

基本上,您的表模式只是将每一行加载为单个“字符串”列,然后根据需要在每个查询的基础上提取相关的json字段。例如来自该博客帖子的此查询:

SELECT b.blogID, c.email FROM comments a LATERAL VIEW json_tuple(a.value, 'blogID', 'contact') b 
AS blogID, contact  LATERAL VIEW json_tuple(b.contact, 'email', 'website') c 
AS email, website WHERE b.blogID='64FY4D0B28';

在我谦逊的经历中,这已被证明更可靠(我遇到了处理JSON serdes的各种神秘问题,特别是对于嵌套对象)。


3
投票

我只是必须解决同样的问题,而且与JSON SerDes相关的任何一个似乎都不够好。亚马逊可能会很好,但我无法在任何地方找到它的来源(有没有人有链接?)。

HCatalog内置的JsonSerDe正在为我工​​作,尽管我实际上并没有在其他任何地方使用HCatalog。

https://github.com/apache/hcatalog/blob/branch-0.5/core/src/main/java/org/apache/hcatalog/data/JsonSerDe.java

要使用HCatalog的JsonSerDe,请将hcatalog-core .jar添加到Hive的auxpath并创建您的hive表:

$ hive --auxpath /path/to/hcatalog-core.jar

hive (default)>
create table my_table(...)
ROW FORMAT SERDE
  'org.apache.hcatalog.data.JsonSerDe'
...
;

我在这里写了一篇更详细的帖子

http://ottomata.org/tech/too-many-hive-json-serdes/


2
投票

hcatalog-core中的Hive 0.12及更高版本具有JsonSerDe,它将序列化和反序列化您的JSON数据。因此,您需要做的就是创建一个外部表,如下例所示:

CREATE EXTERNAL TABLE json_table (
    username string,
    tweet string,
    timestamp long)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION
 'hdfs://data/some-folder-in-hdfs'

相应的json数据文件应如下所示:

{"username":"miguno","tweet":"Rock: Nerf paper, scissors is fine.","timestamp": 1366150681 }
{"username":"BlizzardCS","tweet":"Works as intended.  Terran is IMBA.","timestamp": 1366154481 }

1
投票

Generating SerDe schema from .json file

如果.json文件很大,手动编写模式可能会很繁琐。如果是这样,您可以使用这个方便的工具自动生成它。

https://github.com/strelec/hive-serde-schema-gen


0
投票

现在,Hive开箱即可使用JSON处理功能。

Hive 4.0.0及更高版本

CREATE TABLE ... STORED AS JSONFILE

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormatsStorageFormatsRowFormat,StorageFormat,andSerDe

必须将每个JSON对象展平为适合单行(不支持换行符)。这些对象不是正式JSON数组的一部分。

{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}
© www.soinside.com 2019 - 2024. All rights reserved.