web-dev-qa-db-ja.com

from_unixtimeをミリ秒でハイブする

Hiveにはタイムスタンプエポック列(BIGINT)が保存されています。このエポックの日付「yyyy-MM-dd」を取得します。問題は、私のエポックがミリ秒単位であることです。 1409535303522。したがって、タイムスタンプfrom_unixtime(timestamp、 'yyyy-MM-dd')を選択すると、エポックが秒単位で予想されるため、日付に対して誤った結果が返されます。

だから私はそれを1000で割ってみました。しかし、それからDoubleに変換され、関数を適用できません。このdoubleをBigintに変換しようとすると、CASTでも機能しません。

15
Sourabh Potnis

次のクエリで解決しました:

select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;
28
Sourabh Potnis

元の答えでは文字列を取得しますが、日付を取得したい場合は、日付付きの追加キャストを呼び出す必要があります:

_select 
    timestamp, 
    cast(from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') as date) as date_col 
from Hadoop_V1_Main_text_archieved 
limit 10;
_

Docs 日付とタイムスタンプをキャストします。文字列を日付に変換する場合:

cast(string as date)
文字列の形式が「YYYY-MM-DD」の場合、その年/月/日に対応する日付値が返されます。文字列値がこの形式と一致しない場合、NULLが返されます。

日付タイプは、前述のようにHive> _0.12.0_からのみ使用可能です here

DATE(注:Hive 0.12.0以降でのみ使用可能)

3

timestamp_msはミリ秒単位のunixtimeです

SELECT from_unixtime(floor(CAST(timestamp_ms AS BIGINT)/ 1000)、 'yyyy-MM-dd HH:mm:ss.SSS')as created_timestamp FROM table_name;