带有 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

在 hive 中使用 group by 和 distinct 得到错误的结果

带有 MAX() 的 GROUP BY 返回错误的行 ID

带有 2 个表的 SQL Server GROUP BY

hive的 order by & distribute by & cluter by