带有 ORDER BY 的 HIVE GROUP_CONCAT
Posted
技术标签:
【中文标题】带有 ORDER BY 的 HIVE GROUP_CONCAT【英文标题】:HIVE GROUP_CONCAT with ORDER BY 【发布时间】:2018-02-28 11:27:28 【问题描述】:我有一张这样的桌子
我希望这样的输出(将结果分组到一条记录中,group_concat 应该按值 DESC 对结果进行排序)。
这是我尝试过的查询,
SELECT id,
CONCAT('',CONCAT_WS(',',GROUP_CONCAT(CONCAT('"',key, '":"',value, '"'))), '') AS value
FROM
table_name
GROUP BY id
我希望目标表中的值应按源表值排序(降序)。
为此,我尝试了 GROUP_CONCAT(... ORDER BY value)。
看起来 Hive 不支持这个。有没有其他方法可以在 hive 中实现这一点?
【问题讨论】:
【参考方案1】:试试这个查询。
Hive 不支持 GROUP_CONCAT 函数,但是您可以使用 collect_list 函数来实现类似的功能。此外,您将需要使用分析窗口函数,因为 Hive 不支持 collect_list 函数中的 ORDER BY 子句
select
id,
-- since we have a duplicate group_concat values against the same key
-- we can pick any one value by using the min() function
-- and grouping by the key 'id'
-- Finally, we can use the concat and concat_ws functions to
-- add the commas and the open/close braces for the json object
concat('', concat_ws(',', min(g)), '')
from
(
select
s.id,
-- The window function collect_list is run against each row with
-- the partition key of 'id'. This will create a value which is
-- similar to the value obtained for group_concat, but this
-- same/duplicate value will be appended for each row for the
-- same key 'id'
collect_list(s.c) over (partition by s.id
order by s.v desc
rows between unbounded preceding and unbounded following) g
from
(
-- First, form the key/value pairs from the original table.
-- Also, bring along the value column 'v', so that we can use
-- it further for ordering
select
id,
v,
concat('"', k, '":"', v, '"') as c
from
table_name -- This it th
)
s
)
gs
-- Need to group by 'id' since we have duplicate collect_list values
group by
id
【讨论】:
以上是关于带有 ORDER BY 的 HIVE GROUP_CONCAT的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?
mysql使用带有子查询的临时表,但不是group by和order by