Hive 选择数据到结构数组中

Posted

技术标签:

【中文标题】Hive 选择数据到结构数组中【英文标题】:Hive select data into an array of structs 【发布时间】:2015-09-03 21:06:59 【问题描述】:

我试图在 Hive 中找出一种方法来从平面源中选择数据并输出到命名结构的数组中。这是我正在寻找的示例...

样本数据:

house_id,first_name,last_name
1,bob,jones
1,jenny,jones
2,sally,johnson
3,john,smith
3,barb,smith

期望的输出:

1   ["first_name":"bob","last_name":"jones","first_name":"jenny","last_name":"jones"]
2   ["first_name":"sally","last_name":"johnson"]
3   ["first_name":"john","last_name":"smith","first_name":"barb","last_name":"smith"]

我试过 collect_list 和 collect_set 但它们只允许原始数据类型。有什么想法可以在 Hive 中解决这个问题吗?

【问题讨论】:

【参考方案1】:

我会使用这个jar,它是collect 的更好实现(并且采用复杂的数据类型)。

查询

add jar /path/to/jar/brickhouse-0.7.1.jar;
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';

select house_id
  , collect(named_struct("first_name", first_name, "last_name", last_name))
from db.table
group by house_id

输出

1   ["first_name":"bob","last_name":"jones", "first_name":"jenny","last_name":"jones"]
2   ["first_name":"sally","last_name":"johnson"]
3   ["first_name":"john","last_name":"smith","first_name":"barb","last_name":"smith"]

【讨论】:

完美!按说明工作。 有没有办法做到这一点而不必显式声明named_struct?例如:collect(*)【参考方案2】:

您也可以使用解决方法

select collect_list(full_name) full_name_list from (
    select 
        concat_ws(',', 
            concat("first_name:",first_name), 
            concat("last_name:",last_name)
            ) full_name, 
        house_id
    from house) a 
group by house_id

【讨论】:

【参考方案3】:

您可以使用 pyspark 或 scalaspark 进行尝试。Spark sql 允许原始数据类型和非原始数据类型。 即,你可以做 collect_set(named_struct)

【讨论】:

以上是关于Hive 选择数据到结构数组中的主要内容,如果未能解决你的问题,请参考以下文章

从 Hive 数组中选择特定值

Hive安装

hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组

Hive编程指南学习03

在选择查询中使用 hive 分桶

数据结构和算法选择排序