我想创建一个蜂巢表了一些JSON数据(嵌套),并在其上运行的查询? 这甚至可能吗?
只要上传JSON文件,以S3和发射EMR比如我已经得到了,但我不知道在蜂巢控制台来获取JSON文件是一个蜂巢表输入什么?
有没有人有让我开始了一些示例命令,我找不到任何与谷歌有用...
我想创建一个蜂巢表了一些JSON数据(嵌套),并在其上运行的查询? 这甚至可能吗?
只要上传JSON文件,以S3和发射EMR比如我已经得到了,但我不知道在蜂巢控制台来获取JSON文件是一个蜂巢表输入什么?
有没有人有让我开始了一些示例命令,我找不到任何与谷歌有用...
你需要使用一个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/' ;
这其实没有必要使用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,尤其是嵌套对象的各种神秘的问题)。
我不得不解决同样的问题,并没有任何的作为尚未连接到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/
蜂巢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 }
如果你以.json文件特别大,这可能是乏味的手工编写的模式。 如果是这样,你可以用这个方便的工具来自动生成它。
https://github.com/strelec/hive-serde-schema-gen
JSON处理能力,现已在蜂巢外的开箱。
蜂巢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}