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

nic*_*ine 33 json hadoop hive amazon-emr emr

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

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

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

Mik*_*ass 32

实际上没有必要使用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';
Run Code Online (Sandbox Code Playgroud)

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


see*_*ead 24

您需要使用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/' ;
Run Code Online (Sandbox Code Playgroud)