具有group by in hive的数组类型上的collect_set

时间:2017-05-02 00:06:12

标签: hadoop hive

我在下面的表中包含id的重复项,每个id都包含值数组,我想找出每个id的唯一值,该怎么做?

CREATE TABLE test(
id string,
values array<string>)

当我在命令下运行时,它会抛出错误,因为collect_set仅支持原始类型值。

select id, collect_set(values) from ts group by id;

错误:

  

FAILED:UDFArgumentTypeException只有基本类型参​​数   接受,但数组作为参数1传递。

2 个答案:

答案 0 :(得分:3)

正如错误消息显示Only primitive type arguments are accepted but array was passed as parameter 1.,您需要在使用之前将数组转换为String。

您可以使用explode()功能实现相同的功能。类似的东西:

select 
  id, 
  collect_set(tokens) 
FROM
  ts LATERAL VIEW explode(values) x AS tokens
group by
  id;

我希望这会对你有所帮助。

答案 1 :(得分:0)

解决此问题的另一种非正式方法,特别是在具有许多group by和collect_set的嵌套查询中,是使用 concat_ws(&#34;&#34;,值)将数组连接成一个字符串

select id, collect_set(concat_ws("", values)) from ts group by id;