2015-01-14 26 views
11

Chúng tôi có cột dấu thời gian (BIGINT) được lưu trữ trong Hive. Chúng tôi muốn lấy ngày 'yyyy-MM-dd' cho thời đại này. Sự cố là kỷ nguyên của tôi tính bằng mili giây, ví dụ: 1409535303522. Vì vậy, chọn dấu thời gian, from_unixtime (dấu thời gian, 'yyyy-MM-dd') cho kết quả sai cho ngày vì nó dự kiến ​​thời gian trong vài giây.Hive from_unixtime cho mili giây

Vì vậy, tôi đã cố gắng chia nó cho 1000. Nhưng sau đó nó được chuyển đổi thành Đôi và chúng tôi không thể áp dụng chức năng cho nó. Ngay cả CAST không hoạt động khi tôi cố gắng Chuyển đổi đôi này thành Bigint.

+1

Nếu bạn thay đổi định dạng để ' yyyy-MM-dd HH: mm: ss.SSS '? – LiMuBei

Trả lời

22

Giải quyết nó bằng cách truy vấn sau đây:

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

điều này không hoạt động .. nó đưa ra một lỗi - Không có phương thức nào phù hợp với lớp org.apache.hadoop.hive.ql.udf.UDFFromUnixTime với (double, string). – Arnab

+2

Yup. Tôi đã cập nhật nó với phiên bản cố định – Cristian

1

timestamp_ms là unixtime trong mili giây

CHỌN from_unixtime (sàn (CAST (timestamp_ms AS bigint)/1000), 'yyyy-MM- dd HH: mm: ss.SSS ') như created_timestamp FROM table_name;

2

Trong câu trả lời ban đầu bạn sẽ nhận được chuỗi, nhưng nếu bạn muốn để có được ngày bạn cần phải gọi thêm dàn diễn viên với ngày:

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 cho những ngày casting và timestamps . Để chuyển đổi chuỗi ngày:

cast(string as date)
Nếu chuỗi có dạng 'YYYY-MM-DD', sau đó một giá trị ngày tháng tương ứng với năm/tháng/ngày được trả về. Nếu giá trị chuỗi không khớp với formate này, thì NULL được trả về.

Ngày loại là chỉ có sẵn từ Hive>0.12.0 như đã đề cập here:

DATE (Lưu ý: Chỉ xuất hiện bắt đầu với Hive 0.12.0)