【问题标题】:Hive : How to aggregate over map column and return mapHive:如何聚合地图列并返回地图
【发布时间】:2020-07-15 23:37:38
【问题描述】:

我有一个蜂巢表

create table tab(
col1 map<string,array<string>>)

看起来像

select key,value from tab lateral view explode(col1) e as key, value;

key |  value
-------------------
a   | ['1','2','3']
b   | ['4','5','6']
a   | ['7','8','9']
b   | ['12',11','12']

现在我想获得每个键的值大小的总和。即我想看到这样的东西

{'a':6,'b':6}

我知道我可以做这样的事情

select key,sum(size(value)) from tab lateral view explode(col1) e as key, value group by key;

它给了我

a 6
b 6

但我希望上述结果出现在一个映射中,因为我将使用它在我的目标表中插入语句,该目标表需要 map&lt;string,int&gt;

我怎样才能做到这一点?

我试过了

select map(key,sum(size(value))) from tab lateral view explode(col1) e as key, value group by key;

但显然它只是给了我

{'a': 6}
{'b': 6}

【问题讨论】:

  • 不确定您还需要什么。最终查询是正确的,您得到 map&lt;string,int&gt;
  • {'a': 6} 只是 Hive 在 shell 中表示地图的方式,您的查询结果为 map&lt;string, bigint&gt;
  • 我的错误。我更新了帖子。我希望最终结果为{'a':6,'b':6}
  • 使用砖房收集 UDAF:stackoverflow.com/a/62156562/2700344

标签: java sql hive aggregate-functions hiveql


【解决方案1】:

说到标准 Hive 函数,您将需要最终的 collect_list 聚合和 str_to_map UDF:

select str_to_map(concat_ws(',', collect_list(concat(t.key, ':', t.value)))) as result_map
  from (
    select key, sum(size(value)) as value
      from tab 
   lateral view explode(col1) e as key, value 
     group by key
     ) t

还可以看看 Brickhouse Collect UDAF (direct link to the code):这可能比在转换过程中创建字符串更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多