2015-01-14 36 views
11

Hive'da depolanmış bir zaman damgası epoch sütunumuz (BIGINT) var. Bu çağ için 'yyyy-MM-dd' tarihini almak istiyoruz. Sorun benim çağımın milisaniye cinsinden örn. 1409535303522. Zaman damgasını seçin, from_unixtime (zaman damgası, 'yyyy-MM-dd'), saniyeler içinde çağı beklediği için tarih için yanlış sonuçlar verir.Milisaniye için kovandan çıkma süresi

Yani 1000 ile bölmeyi denedim. Ama sonra Double'e dönüştürülüyor ve ona işlev uygulayamıyoruz. Bu ikiliyi Bigint'e çevirmeye çalıştığımda CAST bile çalışmıyor.

+1

sen 'için biçimini değiştirirseniz yyyy-MM-dd HH: mm: ss.SSS '? – LiMuBei

cevap

22

aşağıdaki sorgu bunu çözüldü: BIGINT OLARAK

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

bu işe yaramaz .. bir hata verir - sınıf org.apache.hadoop.hive.ql.udf.UDFFromUnixTime için eşleşen bir yöntem yok (çift, dize). – Arnab

+2

Yup. Sabit bir sürümle güncelledim – Cristian

1

timestamp_ms milisaniye unixtime

SEC from_unixtime olan (Kat (CAST (timestamp_ms)/1000), 'yyyy-MM dd HH: mm: ss.SSS ') created_timestamp FROM table_name;

2
dizeyi alırsınız orijinal cevap olarak

, ama sen tarihle ekstra döküm çağırmanız gerekir tarihi almak isterseniz: döküm tarihleri ​​ve zaman damgaları için

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 . Bugüne kadar dizeyi dönüştürmek için: string formu 'YYYY-AA-GG' olduğunu

cast(string as date)
, o zaman o yıl/ay/gün gelen bir tarih değeri döndürülür. Dize değeri bu biçimlendirmeyle eşleşmezse, NULL döndürülür.

DATE:

Tarih türü yalnızca söz here olarak Hive dan>0.12.0 kullanılabilir (Not: Sadece mevcut Hive 0.12.0 ile başlayan)