将数据从多个 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的主要内容,如果未能解决你的问题,请参考以下文章

将多个 JSON 数据转换为 HTML 表 [重复]

如何将数据从多个输入字段转换为单个 JSON 对象以进一步将其插入单个 mysql 字段

将多个 Hive 表合并为 Hadoop 中的单个表

使用 Python 将多个关系表转换为嵌套 JSON 格式

Hive处理Json数据

有多个'。 sqoop 将数据从 Mysql 导出到 hive datetime 类型后的 0'