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

unguejic  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(261)

我有两个配置单元表之间的数据,我需要连接它们并生成一个json对象。我发现很少有库(brickhouse、openx)将配置单元表Map到复杂的json模式。但是,我无法找到将两个表的结果放入此配置单元表的方法。
例如:
表-a
列1列2
“用户登录”30
表b
列1列2列3
“用户登录”“站点a”10
“用户登录”“站点b”20
我想生成一个json对象,例如:
{name:“用户登录”,
子级:[{名称:“站点a”,logins:10},{名称:“站点b”,logins:20}] }
我试过寻找任何可能的解决方案的线索,但大多数在线链接都是关于将json转换为配置单元表的,而不是相反。有没有更好/更简单的方法来实现这一点?

q7solyqu

q7solyqu1#

可以使用 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}]}

你可以从brickhouse博客中找到更多关于udf用法的细节。

brtdzjyr

brtdzjyr2#

我想你是在找砖厂的自选基金。

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

相关问题