Hive:更简洁的 SELECT AS 和 GROUP BY 方式

Posted

技术标签:

【中文标题】Hive:更简洁的 SELECT AS 和 GROUP BY 方式【英文标题】:Hive: More clean way to SELECT AS and GROUP BY 【发布时间】:2015-04-04 05:53:27 【问题描述】:

我尝试这样写 Hive Sql

SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY year

但是 Hive 无法识别别名“year”,它抱怨: FAILED: SemanticException [Error 10004]: Line 1:79 Invalid table alias or column reference 'year'

一种解决方案(Hive: SELECT AS and GROUP BY) 建议使用 'GROUP BY substr(date, 1, 4)'。

有效! 但是在某些情况下我要分组的值可能是由多行hive函数代码生成的,这样写代码很丑

SELECT count(1), func1(func2(..........................)) AS something
FROM ***
GROUP BY func1(func2(..........................))

Hive 中是否有任何干净的方法可以做到这一点?有什么建议吗?

【问题讨论】:

【参考方案1】:

在 Group By 中指定位置将解决您的问题。即使在 SET hive.groupby.orderby.position.alias=false; 时,Group By 中的这个位置编号也有效 (蜂巢 0.12)

SELECT count(1), substr(date, 1, 4) as year  
FROM ***
GROUP BY 2;

【讨论】:

太棒了。我正在寻找这个 它对我有用,但仅当属性设置为 true 时【参考方案2】:

在 Hive 0.11.0 及更高版本中,如果 hive.groupby.orderby.position.alias 设置为 true(默认为 false),则可以按位置指定列。 因此,在您的 .hql 中设置 set hive.groupby.orderby.position.alias=true;(或 .hiverc 以获得永久解决方案)就可以解决问题,然后您可以在上面的示例中键入 group by 2。 来源:hive language manual

【讨论】:

【参考方案3】:

想到的一个解决方案是将GROUP BY 放在外部查询中:

SELECT count(*) , year FROM 
(
   SELECT substr(date, 1, 4) as year FORM ***
) inner
GROUP BY year

GL!

【讨论】:

效率如何?好像Hive会先生成一个大小相同的临时表,然后再进行聚合操作? 您是 100% 正确的,它可能会对性能产生不利影响。但这似乎是在Group by 中省略函数使用的唯一方法。这里的问题是,如果 hive 在您的常规查询中两次评估函数值?我的猜测是只评估一次。在这种情况下,您的原始查询似乎是最佳的。

以上是关于Hive:更简洁的 SELECT AS 和 GROUP BY 方式的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Hive 中通过/存储通过“CREATE TABLE AS SELECT .....”创建的表进行集群吗?

有没有更简洁的方式在这里使用 Select Case?

hive函数row_numberrank和dense_rank的对比

sql server 中的 CTE (With table as) 在 hive 中等效吗?

大数据之Hive:with tmp1 as ()

with as 用法