2016-11-01 9 views
2

のタイムスタンプする日付からタイプ強制、LHStimestamp<=RHSdate)同じ値の'2013-09-30'はとして等しいを治療されていません。一方、RHSにおけるCASTTIMESTAMPは良好に機能する。ハイブ - 私はスパークSQLにハイブクエリを実行すると表現

> SELECT CASE 
      WHEN CAST(ADD_MONTHS(CAST('2013-09-30' AS DATE), +1) AS TIMESTAMP) <= ADD_MONTHS(CAST('2013-09-30' AS DATE), +1) 
      THEN 'less than or equal' 
      ELSE 'greater' 
     END AS TIMESTAMP_LTE_DATE 
FROM 
VALUES(1); 
+---------------------+--+ 
| TIMESTAMP_LTE_DATE | 
+---------------------+--+ 
| greater    | 
+---------------------+--+ 

我々は、すべてのクエリをよりDATETIMESTAMP組み合わせで非常に多くの表現が動的に生成されますがあります。したがって、見つけることは困難で、すべての場所でCASTの列または値を使用してください。

式のRHS/LHSをHive/SparkSQLの上位データ型(型強制\)に自動的に変換する方法はありますか?

同様にOracle 11gでも同様のクエリを試したところ、equalに行くと正常に動作します。

あなたのお手伝いをよろしくお願いいたします。

+0

diffソリューションの新しい回答(スパークが次のバージョンを解決する場合)/ハックはいつでも歓迎します。 – mrsrinivas

答えて

2

残念ながらtype coercion rules for TimestampType/DateType比較がハードコーディングされたとStringTypeに両側に変換されています

// Comparisons between dates and timestamps. 
case p @ BinaryComparison(left @ TimestampType(), right @ DateType()) => 
    p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType))) 
case p @ BinaryComparison(left @ DateType(), right @ TimestampType()) => 
    p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType))) 

と辞書式順序日付表示日付表現が同じ日付のタイムスタンプの表現の前に行くと。

関連する問題