web-dev-qa-db-ja.com

Hive:SELECTASおよびGROUPBYのよりクリーンな方法

私はそのようなHiveSqlを書こうとします

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 '

1つの解決策( Hive:SELECTASおよびGROUPBY )は、「GROUP BY substr(date、1、4)」の使用を提案しています。

できます!ただし、場合によってはグループ化したい値がHive関数コードの複数行から生成されることがあります、次のようなコードを書くのは非常に醜いです

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

Hiveにそれを行うためのクリーンな方法はありますか?助言がありますか?

10
twds

Group Byで位置を指定すると、問題が解決します。 Group Byのこの位置番号SET Hive.groupby.orderby.position.alias = false;(Hive 0.12)の場合でも機能します

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

Hive 0.11.0以降では、Hive.groupby.orderby.position.aliasがtrueに設定されている場合(デフォルトはfalse)、列を位置で指定できます。したがって、.hql(または永続的なソリューションの場合は.hiverc)にset Hive.groupby.orderby.position.alias=true;を設定するとうまくいき、上記の例ではgroup by 2と入力できます。出典: Hive言語マニュアル

7

頭に浮かぶ解決策の1つはGROUP BY外部クエリへ:

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

GL!

0
www