1

次のようなHiveQLクエリがあります。

SELECT  ID, 
        CASE WHEN col_a = 0 THEN 0
        ELSE (col_b / col_a) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

これをHiveで実行すると、最近エラーが発生し始めましたFAILED: Error in semantic analysis: Line X:Y ArgumentTypeMismatch 'col_a': The expression after ELSE should have the same type as those after THEN: "int" is expected but "double" is found.

0リテラルとの結果の間にデータ型の不一致があることは理解していますが(col_a / col_b)、Hiveがこれを窒息させている理由、そしてさらに重要なことに、このエラーを解決するための最善の行動は明確ではありません。リテラル0をとしてキャストする必要がありますか、doubleそれともより良いアプローチがありますか?

これは、AmazonEMRで実行されているHive0.8.1です。

4

1 に答える 1

7

col_a と col_b が両方であると仮定すると、これは奇妙な動作intsです。リテラル0はもちろんintであり、wiki チュートリアルの除算によると、「B を A から除算した結果が得られます。結果の型は、オペランドの型の共通の親 (型階層内) と同じです。オペランドが整数型の場合、結果は除算の商になりintます。 」

私はHive 0.10.0を実行していますが、あなたと同じエラーが発生(col_b / col_a)doubleますint。これは私にはバグのように見えますが、私が見つけていない仕様に微妙な何かがあるかもしれません。

いくつかの解決策があります。

SELECT  ID, 
    CASE WHEN col_a = 0 THEN CAST(0 AS DOUBLE)
    ELSE (col_b / col_a) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

SELECT  ID, 
    CASE WHEN col_a = 0 THEN 0.0
    ELSE (col_b / col_a) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

同等ですが、おそらく必要だと思います

SELECT  ID, 
    CASE WHEN col_a = 0 THEN 0
    ELSE CAST((col_b / col_a) AS INT) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

col_acol_bが両方であると仮定するとints、ウィキで指定されているように、結果を整数除算にしたいとします。うまくいけば、他の誰かがやって来て、あなたの仮説的な「より良いアプローチ」を提案してくれるでしょう。

col_aorが double の場合col_b、または結果を浮動小数点除算にしたい場合は、他のすべてを無視して to に変更0して、 to Hive0.0のように見えないようにします。int

于 2013-03-18T21:37:27.243 に答える