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 .....”创建的表进行集群吗?
hive函数row_numberrank和dense_rank的对比