你如何做一个HIVE表了JSON数据?(How do you make a HIVE table o

2019-06-26 07:26发布

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

只要上传JSON文件,以S3和发射EMR比如我已经得到了,但我不知道在蜂巢控制台来获取JSON文件是一个蜂巢表输入什么?

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

Answer 1:

你需要使用一个JSON SERDE为了蜂房你的JSON映射到你的表中的列。

您展示如何最好的一个例子是在这里:

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

不幸的是提供不处理嵌套的JSON非常好,所以你可能需要扁平化JSON你为了使用它的JSON SERDE。

下面是文章的正确语法的例子:

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/' ;


Answer 2:

这其实没有必要使用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,尤其是嵌套对象的各种神秘的问题)。



Answer 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核心的.jar添加到蜂房的auxpath并创建蜂巢表:

$ 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/



Answer 4:

蜂巢0.12后来在hcatalog核心具有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'

该corresponsing JSON数据文件应该看起来像下面的例子:

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


Answer 5:

从以.json文件生成模式SERDE

如果你以.json文件特别大,这可能是乏味的手工编写的模式。 如果是这样,你可以用这个方便的工具来自动生成它。

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



Answer 6:

JSON处理能力,现已在蜂巢外的开箱。

蜂巢4.0.0及更高版本

CREATE TABLE ... STORED AS JSONFILE

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

  • https://issues.apache.org/jira/browse/HIVE-18785
  • https://issues.apache.org/jira/browse/HIVE-19899

每个JSON对象必须被展平到适合于一个线(不支持新行字符)。 这些对象是不是一个正式的JSON阵列的一部分。

{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}


文章来源: How do you make a HIVE table out of JSON data?