Hive select 数据到一个结构数组中
Hive select data into an array of structs
我正在尝试在 Hive 中找出一种方法来 select 来自平面源的数据并输出到命名结构的数组中。这是我正在寻找的示例...
示例数据:
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 中解决这个问题有什么想法吗?
我会使用这个 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"}]
您也可以使用变通方法
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
您可以使用 pyspark 或 scalaspark 进行尝试。Spark sql 允许原始数据类型和非原始数据类型。
即,你可以做 collect_set( named_struct)
我正在尝试在 Hive 中找出一种方法来 select 来自平面源的数据并输出到命名结构的数组中。这是我正在寻找的示例...
示例数据:
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 中解决这个问题有什么想法吗?
我会使用这个 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"}]
您也可以使用变通方法
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
您可以使用 pyspark 或 scalaspark 进行尝试。Spark sql 允许原始数据类型和非原始数据类型。 即,你可以做 collect_set( named_struct)