2016-12-22 12 views
3

こんにちは、私は、TRUNCとTO_DATEの使用の違いがHiveにあるかどうかを調べることを試みています。HiveのTRUNCとTO_DATEの違い

は、現在Oracleの中、私は、以下に示すデータに対して、次のcase文を書いた:

ORDER_NO | NAME | DATE_ | TASK_NO 
ABC123 | Humpty | 07-OCT-16 12:30:54 | 1 
ABC123 | Humpty | 07-OCT-16 12:30:54 | 2 
ABC123 | Humpty | 07-OCT-16 12:32:20 | 6 

SELECT ORDER_NO, NAME, DATE_, TASK_NO 
    (CASE WHEN DATE_ - LAG(DATE_) OVER (PARTITION BY ORDER_NO, NAME, TRUNC(DATE_) ORDER BY DATE_) <= 1/48 
    THEN 0 ELSE 1 END) AS COUNT1 

を、これは私の結果与える:

ORDER_NO | NAME | DATE_ | TASK_NO | COUNT1 
    ABC123 | Humpty | 07-OCT-16 12:30:54 | 1 | 1 
    ABC123 | Humpty | 07-OCT-16 12:30:54 | 2 | 0 
    ABC123 | Humpty | 07-OCT-16 12:32:20 | 6 | 1 

正しいです。私は私の完全なデータセットに対するハイブで同じクエリを使用している場合今私は、エラーメッセージが表示されます。

Error while compiling statement: FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. 

だから私はTO_DATEするTRUNCを変更し、この作品、私に次のような結果得られます。

SELECT ORDER_NO, NAME, DATE_, TASK_NO 
(CASE WHEN DATE_ - LAG(DATE_) OVER (PARTITION BY ORDER_NO, NAME, TO_DATE(DATE_) ORDER BY DATE_) <= 1/48 
    THEN 0 ELSE 1 END) AS COUNT1 

これは私に結果を与える:

ORDER_NO | NAME | DATE_ | TASK_NO | COUNT1 
ABC123 | Humpty | 07-OCT-16 12:30:54 | 1 | 1 
ABC123 | Humpty | 07-OCT-16 12:32:20 | 6 | 1   
ABC123 | Humpty | 07-OCT-16 12:30:54 | 2 | 1 

これは私がOracleで得るものとは異なります。私が集めることができるものから、日付の値は日付/時間で並べ替えられないので、日付の値は文字列として格納されます。これは問題があると思うところですが、修正するために何を変更する必要があるかはわかりません。

本当にいくつかのアドバイスをいただきありがとうございます。


更新されたコード:

SELECT 
ORDER_NO 
,NAME 
,DATE_FIXED 
,TASK_NO 
,CASE WHEN DATE_UTS - LAG(DATE_UTS) OVER (PARTITION BY ORDER_NO, NAME, TO_DATE(DATE_FIXED) ORDER BY DATE_FIXED) <= 60*30 
THEN 0 
ELSE 1 
END AS COUNT1 
FROM 
(
SELECT 
ORDER_NO 
,NAME 
,TASK_NO 
,FROM_UNIXTIME(UNIX_TIMESTAMP(DATE_, 'DD-MMM-YY HH:MM:SS')) AS DATE_FIXED 
,UNIX_TIMESTAMP(DATE_, 'DD-MMM-YY HH:MM:SS') AS DATE_UTS 
FROM TABLE1 
) T 
+0

「DATE_」列のタイプは何ですか? – Kacper

+0

Thanks Kacper、OracleのDATE_は日付データ型としてダウンしています。 – user3191160

+0

DATE_タイプはHiveですか? –

答えて

3

Hive Operators and User-Defined Functions (UDFs)

TO_DATE

タイムスタンプ列の日付部分を返し(プレハイブ2.1.0) :
to_date( "1970-01-01 00:00:00")= "1970-01-01"。
Hive 2.1.0以降、日付オブジェクトを返します。
Hive 2.1.0より前(HIVE-13248)、メソッドの作成時にDate型が存在しなかったため、戻り値の型はStringでした。


TRUNCは

戻り(ハイブ 1.2.0のような)形式で指定された単位に切り捨てられた日付。
サポートされるフォーマット:MONTH/MON/MM、YEAR/YYYY/YY。
例:trunc( '2015-03-17'、 'MM')= 2015-03-01。

あなたは1つのパラメータを取る必要がありますハイブでTrunc

  • TASK_NO間と (CASE WHENコンマはありませんでした、その日のためのパラメータがない、あなたの元のクエリでエラー

    1. を持っています。
    2. 日付のマイナス演算子はありません(文字列の場合もありません)。これはNULLになります。ハイブ内

    ザ・のみ認識日付形式は、あなたのデータと一致しないYYYY-MM-DDです。
    無効な文字列に日付関数を適用するとNULLになります。

    これはあなたのデータ形式が日付に変換する方法である:

    hive> select from_unixtime(unix_timestamp('07-OCT-16 12:30:54','dd-MMM-yy HH:mm:ss')); 
    OK 
    2016-10-07 12:30:54 
    

    と全体の問合せ:

    select ORDER_NO 
         ,NAME 
         ,DATE_fixed 
         ,TASK_NO 
    
         ,case 
          when DATE_uts 
           - LAG(DATE_uts) OVER 
            (
             PARTITION BY ORDER_NO,NAME,to_date(DATE_fixed) 
             ORDER BY  DATE_fixed 
            ) 
           <= 60*30 
          then 0 
          else 1 
         end    AS COUNT1 
    
    from (select ORDER_NO 
           ,NAME 
           ,TASK_NO 
           ,from_unixtime(unix_timestamp(DATE_,'dd-MMM-yy HH:mm:ss')) as DATE_fixed 
           ,unix_timestamp(DATE_,'dd-MMM-yy HH:mm:ss')     as DATE_uts 
    
         from t 
         ) t 
    ;   
    

    ABC123 Humpty 2016-10-07 12:30:54 2 1 
    ABC123 Humpty 2016-10-07 12:30:54 1 0 
    ABC123 Humpty 2016-10-07 12:32:20 6 0 
    

    これはOracle上でテストしたときの結果でもあります

    +0

    どうぞご覧ください –

    +0

    Duduがやってくれてありがとう、これを日付にするための回避策は何ですか? – user3191160

    +0

    私はちょうどあなたのために何かをチェックしています –