嵌套 json 的 Hive 查询

Posted

技术标签:

【中文标题】嵌套 json 的 Hive 查询【英文标题】:Hive query for nested json 【发布时间】:2014-03-28 12:28:30 【问题描述】:

我在 hive 中存储了以下 json

 "key":123,"c1":["s1","s2","s3"],"c2":"k1":"v1","k2":"v2"
 "key":456,"c1":["s4","s5","s6"],"c2":"k3":"v3","k4":"v4"

现在我想要查询给定的配置单元 json,所以我会得到以下输出 输出:

key c1 c1 c1 c2 c2 c2 c2 123 s1 s2 s3 k1 v1 k2 v2 456 s4 s5 s6 k3 v3 k4 v4

那么在 hive 中怎么可能,或者我错过了我的输出结构?

【问题讨论】:

你试过什么创建表语句? @MukeshS 我使用下面的链接 github.com/mongodb/mongo-hadoop/tree/master/hive 使用了 mongo hive 转换,所以我在 hive 中使用了我的 mongo douments。 好吧,很抱歉,我没有在 mongodb 上工作过,所以帮不了你太多。我以为你只使用 Hive 和 Json。 希望我在这篇文章中的回复能帮助到***.com/a/38727609/6668328 【参考方案1】:

您可以使用 Brickhouse JSON UDFS (http://github.com/klout/brickhouse) 将 JSON 解析为 Hive 结构,然后访问这些值。

SELECT strct.key,
       strct.c1[ 0 ], strct.c1[1], strct.c1[2],
       map_keys( strct.c2 )[ 0 ], map_values( strct.c2)[0],   
       map_keys( strct.c2 )[ 1 ], map_values( strct.c2)[1]
FROM (
  SELECT from_json( json_str, 
        named_struct("key", 0, "c1", array(""), "c2", map("","") )) as strict
  FROM json_table
) js;

阅读 Brickhouse 忏悔博客帖子以获取更多信息,地址为 http://brickhouseconfessions.wordpress.com/2014/02/07/hive-and-json-made-simple/。

【讨论】:

【参考方案2】:

发布端到端解决方案。将 JSON 转换为 hive 表的分步过程:

第 1 步)安装 maven(如果还没有)

>$ sudo apt-get install maven

第 2 步)如果还没有安装 git

>sudo git clone https://github.com/rcongiu/Hive-JSON-Serde.git

步骤 3) 进入 $HOME/HIVE-JSON_Serde 文件夹

步骤 4) 构建 serde 包

>sudo mvn -Pcdh5 clean package

步骤 5) serde 文件将在 $HOME/Hive-JSON-Serde/json-serde/target/json-serde-1.3.7-SNAPSHOT-jar-with-dependencies.jar

步骤 6) 在 hive 中添加 serde 作为依赖 jar

 hive> ADD JAR $HOME/Hive-JSON-Serde/json-serde/target/json-serde-1.3.7- SNAPSHOT-jar-with-dependencies.jar;

步骤 7)在 $HOME/books.json 中创建 json 文件(示例)

"value": ["id": "1","bookname": "A","properties": "subscription": "1year","unit": "3","id": "2","bookname":"B","properties":"subscription": "2years","unit": "5"]

步骤 8) 在 hive 中创建 tmp1 表

 hive>CREATE TABLE tmp1 (
      value ARRAY<struct<id:string,bookname:string,properties:struct<subscription:string,unit:string>>>   
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 
    'mapping.value' = 'value'   
) 
STORED AS TEXTFILE;

步骤 9) 将数据从 json 加载到 tmp1 表中

>LOAD DATA LOCAL INPATH '$HOME/books.json' INTO TABLE tmp1;

步骤10)创建一个tmp2表做爆炸操作表格tmp1,这个中间步骤是将多级json结构分解成多行 注意:如果您的 JSON 结构简单且单层,请避免此步骤

hive>create table tmp2 as 
 SELECT *
 FROM tmp1
 LATERAL VIEW explode(value) itemTable AS items;

步骤 11) 创建 hive 表并从 tmp2 表中加载值

hive>create table books as 
select value[0].id as id, value[0].bookname as name, value[0].properties.subscription as subscription, value[0].properties.unit as unit from tmp2;

步骤 12) 删除 tmp 表

hive>drop table tmp1;
hive>drop table tmp2;

步骤 13) 测试 hive 表

hive>select * from books;

输出:

id名称订阅单位

1 B 1 年 3

2 B 2 年 5

【讨论】:

以上是关于嵌套 json 的 Hive 查询的主要内容,如果未能解决你的问题,请参考以下文章

hive 非正确json格式字段造成查询错误

hive中split结合explode的嵌套split子查询

如何使用 hive 查询查找 hive json 数组字段的长度

带横向视图的 HIVE 查询,Json_Tuple

hive的空格怎么查询

用于在 json 中爆炸的值列表的 Hive 查询