将数据从多个 Hive 表转换为复杂 JSON
Posted
技术标签:
【中文标题】将数据从多个 Hive 表转换为复杂 JSON【英文标题】:Converting data from multiple Hive Tables to Complex JSON 【发布时间】:2014-08-07 17:35:31 【问题描述】:我有两个 Hive 表中的数据,我需要加入这些表并生成一个 JSON 对象。我发现很少有库(BrickHouse、OpenX)将配置单元表映射到复杂的 JSON 模式。但是,我无法找到将两个表中的结果放入此 Hive 表的方法。
例如:
表-A
Col1 Col2
“用户登录”30
表 B
Col1 Col2 Col3
“userLogins”“站点 A”10
“userLogins”“站点 B”20
我想生成一个 JSON 对象,例如:
名称:“用户登录”,
儿童:[name: "Site A", logins:10, name: "Site B", logins:20]
我已尝试找到任何可能的解决方案的线索,但大多数在线链接都是关于将 JSON 转换为 Hive 表,反之亦然。有没有更好/更简单的方法来实现这一目标?
【问题讨论】:
【参考方案1】:这可以使用来自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 使用的更多详细信息。
【讨论】:
是否可以在不知道列名的情况下使用 to_json?我想在 JSON 中包含所有列名,每个表可以有不同的列名。【参考方案2】:我认为您正在寻找从砖房收集的 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 中包含所有列名,每个表可以有不同的列名以上是关于将数据从多个 Hive 表转换为复杂 JSON的主要内容,如果未能解决你的问题,请参考以下文章