web-dev-qa-db-ja.com

Hiveが一部のパーツで指定されたエイリアスを認識できないのはなぜですか

シナリオは次のとおりです。次のようにhqlを呼び出すと、u1のエイリアスが見つからないことがわかります。

_Hive> select user as u1, url as u2 from rank_test where u1 != "";
FAILED: SemanticException [Error 10004]: Line 1:50 Invalid table alias or column reference 'u1': (possible column names are: user, url)
_

この問題は、count(*) as cntを使用しようとする場合と同じです。 where句でエイリアスを使用する方法について誰かにヒントを教えてもらえますか?どうもありがとう!

_Hive> select user, count(*) as cnt from rank_test where cnt >= 2 group by user;
FAILED: ParseException line 1:58 missing EOF at 'where' near 'user'
_
14
Judking

where句はselect句の前に評価されるため、where句で選択したエイリアスを参照することはできません。

ただし、派生テーブルからエイリアスを参照することはできます。

select * from (
  select user as u1, url as u2 from rank_test
) t1 where u1 <> "";

select * from (
  select user, count(*) as cnt from rank_test group by user
) t1 where cnt >= 2;

補足:最後のクエリを作成するより効率的な方法は

select user, count(*) as cnt from rank_test group by user
having count(*) >= 2

私の記憶が正しければ、havingのエイリアスを参照できます。つまり、having cnt >= 2

30
FuzzyTree

バックティックシンボル ``を使用して、Hiveのselectステートメントでエイリアスを使用することができました。

SELECT COL_01 AS `Column_A`;

上記のソリューションはHiveバージョン1.2.1で機能しました。

参照リンク

6
Kumar