私はそのような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にそれを行うためのクリーンな方法はありますか?助言がありますか?
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;
Hive 0.11.0以降では、Hive.groupby.orderby.position.aliasがtrueに設定されている場合(デフォルトはfalse)、列を位置で指定できます。したがって、.hql(または永続的なソリューションの場合は.hiverc)にset Hive.groupby.orderby.position.alias=true;
を設定するとうまくいき、上記の例ではgroup by 2
と入力できます。出典: Hive言語マニュアル
頭に浮かぶ解決策の1つはGROUP BY
外部クエリへ:
SELECT count(*) , year FROM
(
SELECT substr(date, 1, 4) as year FORM ***
) inner
GROUP BY year
GL!