Hive select data into an array of structs

吃可爱长大的小学妹 提交于 2019-11-28 01:43:40

问题


I am trying to figure out a way in Hive to select data from a flat source and output into an array of named struct(s). Here is a example of what I am looking for...

Sample Data:

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

Desired Output:

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

I tried collect_list and collect_set but they only allow primitive data types. Any thoughts of how I might go about this in Hive?


回答1:


I would use this jar, it is a much better implementation of collect (and takes complex datatypes).

Query:

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

Output:

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



回答2:


You can also use a workaround

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:


You can try it using pyspark or scalaspark.. Spark sql allows both primitive and non primitive datatypes. ie., You can do collect_set( named_struct)



来源:https://stackoverflow.com/questions/32385425/hive-select-data-into-an-array-of-structs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!