将数据从多个Hive表转换为Complex JSON

时间:2014-08-07 17:35:32

标签: json hadoop hive apache-pig

我有两个hive表的数据,我需要加入并生成一个JSON对象。我发现很少有库(BrickHouse,OpenX)将hive表映射到复杂的JSON模式。但是,我无法找到将两个表中的结果导入此Hive表的方法。

E.g:

  

表-A

     

Col1 Col2

     

“userLogins”30

     

表B

     

Col1 Col2 Col3

     

“userLogins”“Site A”10

     

“userLogins”“Site B”20

     

我想生成一个JSON对象,例如:

     

{name:“userLogins”,

     

儿童:[{姓名:“网站A”,登录名:10},{姓名:“网站B”,登录名:20}]   }

我已经尝试找到可能解决方案的任何线索,但大多数在线链接都是关于将JSON转换为Hive Table而不是相反。是否有更好/更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

可以使用Brickhouse中的to_json UDF来完成此操作。构建jar文件后,可以添加jar并创建一个临时函数:

add jar /path/brickhouse-0.7.0-SNAPSHOT.jar;

CREATE TEMPORARY FUNCTION to_json AS 'brickhouse.udf.json.ToJsonUDF';  

我使用您提供的样本数据测试了UDF。

describe table_a;
col_1                   string                  None                
col_2                   int                     None                

describe table_b; 
col_1                   string                  None                
col_2                   string                  None                
col_3                   int                     None                

select * from table_a;
userLogins  30

select * from table_b;
userLogins  Site A  10
userLogins  Site B  20

select
to_json(named_struct( 'name', a.col_1, 'children' , array(named_struct('name', b.col_2, 'logins', b.col_3))))
from table_a a
join table_b b
on a.col_1 = b.col_1;

{"name":"userLogins","children":[{"name":"Site B","logins":20}]}
{"name":"userLogins","children":[{"name":"Site A","logins":10}]}

您可以从Brickhouse blog找到有关UDF用法的更多详细信息。

答案 1 :(得分:2)

我认为你正在寻找brickhouse的收集UDF。

select named_struct(
    'name', b.col_1, 
    'children',  collect(named_struct('name', b.col_2, 'logins', b.col_3))) 
from table_a a join table_b b
on a.col_1 = b.col_1
group by b.col_1;

以上输出以下json

{"name":"userLogins","children":[{"name":"Site A","logins":10},{"name":"Site B","logins":20}]}