将数据从多个Hive表转换为复杂的JSON

Aru*_*n R 1 json hadoop hive apache-pig

我在两个配置单元表中有数据,需要联接并生成JSON对象。我发现很少有库(BrickHouse,OpenX)具有配置单元表映射到复杂的JSON模式。但是,我无法找到一种方法将两个表中的结果获取到此Hive表中。

例如:

表A

Col1 Col2

“ userLogins” 30

表B

Col1 Col2 Col3

“ userLogins”“站点A” 10

“ userLogins”“站点B” 20

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

{名称:“ userLogins”,

子代:[{名称:“站点A”,登录名:10},{名称:“站点B”,登录名:20}]}

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

vis*_*akh 5

这可以使用Brickhouseto_jsonUDF 完成。构建jar文件后,可以添加jar并创建一个临时函数,如下所示:

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

CREATE TEMPORARY FUNCTION to_json AS 'brickhouse.udf.json.ToJsonUDF';  
Run Code Online (Sandbox Code Playgroud)

我用您提供的样本数据测试了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}]}
Run Code Online (Sandbox Code Playgroud)

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