将多个配置单元表中的数据转换为复杂JSON

将多个配置单元表中的数据转换为复杂JSON,json,hadoop,hive,apache-pig,Json,Hadoop,Hive,Apache Pig,我有两个配置单元表中的数据,我需要连接它们并生成一个JSON对象。我发现很少有库(BrickHouse、OpenX)将配置单元表映射到复杂的JSON模式。但是,我无法找到将两个表的结果放入此配置单元表的方法 例如: 表A Col1 Col2 “用户登录”30 表B Col1 Col2 Col3 “用户登录”“站点A”10 “用户登录”“站点B”20 我想生成一个JSON对象,例如: {name:“用户登录” 子项:[{名称:“站点A”,登录名:10},{名称:“站点B”,登录名:20}] } 我

我有两个配置单元表中的数据,我需要连接它们并生成一个JSON对象。我发现很少有库(BrickHouse、OpenX)将配置单元表映射到复杂的JSON模式。但是,我无法找到将两个表的结果放入此配置单元表的方法

例如:

表A

Col1 Col2

“用户登录”30

表B

Col1 Col2 Col3

“用户登录”“站点A”10

“用户登录”“站点B”20

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

{name:“用户登录”

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


我已经尝试寻找任何可能的解决方案的线索,但大多数在线链接都是关于将JSON转换为配置单元表的,而不是相反。有没有更好/更简单的方法来实现这一点

这可以使用来自的
to_json
自定义项来完成。构建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}]}

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

这可以使用
to_json
UDF from来完成。构建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的collect自定义项

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}]}

我想你是在找砖厂的collect 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}]}

是否可以在不知道列名的情况下使用to_json?我想在JSON中包含所有列名,每个表可以有不同的列名。是否可以在不知道列名的情况下使用to_JSON?我想在JSON中包含所有列名,每个表可以有不同的列名。是否可以在不知道列名的情况下使用to_JSON?我想在JSON中包含所有列名,每个表可以有不同的列名。在不知道列名的情况下,是否可以使用它来定义JSON?我想在JSON中包含所有列名,每个表可以有不同的列名