hive将数据选择到一个结构数组中

os8fio9y  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(477)

我正在尝试在配置单元中找到一种方法,从平面源中选择数据并输出到一个命名结构的数组中。这是我要找的一个例子。。。
样本数据:

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里该怎么做?

camsedfj

camsedfj1#

我会用这个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"}]
qgzx9mmu

qgzx9mmu2#

也可以使用变通方法

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
3qpi33ja

3qpi33ja3#

你可以用pyspark或scalaspark试试。。sparksql允许原始和非原始数据类型。例如,您可以执行collect\u set(命名为\u struct)

相关问题