2011-08-26 41 views
8

Tôi có tệp nhật ký chứa cột dấu thời gian. Dấu thời gian ở định dạng thời gian nguyên bản.cách chuyển đổi thời gian epoch unix thành chuỗi ngày trong hive

Tôi muốn tạo phân vùng dựa trên dấu thời gian có phân vùng năm, tháng và ngày.

Cho đến nay tôi đã làm điều này nhưng nó đang ném một lỗi.

PARSE ERROR cannot recognize input '(' in column type 

Đây là mã của tôi.

from (
     from raw_data 
      MAP ${PREFIX}raw_data.line 
      USING 's3://scripts/clean.py' 
      AS (timestamp STRING, name STRING) 
    ) map_out 
INSERT OVERWRITE TABLE date_base_data_temp PARTITION(year(timestamp), month(timestamp)), day(timestamp))) 
    select map_out.name; 

Trả lời

24

Oof, trông có vẻ xấu xí. Hãy thử sử dụng chức năng này trong Hive:

SELECT from_unixtime(unix_timestamp) as new_timestamp from raw_data ... 

Hoặc nếu timestamp là trong ms thay vì giây:

SELECT from_unixtime(unix_timestamp DIV 1000) as new_timestamp from raw_data ... 

Đó chuyển đổi một dấu thời gian unix thành một YYYY-MM-DD HH: MM: SS, sau đó bạn có thể sử dụng các chức năng sau để nhận năm, tháng và ngày:

SELECT year(new_timestamp) as year, month(new_timestamp) as month, day(new_timestamp) as day ... 
+0

Cảm ơn! Tiết kiệm rất nhiều thời gian của tôi. Điều này thật đúng với gì mà tôi đã tìm kiếm! –

+2

Hãy chắc chắn rằng 'timestamp_value' (ở đây' unix_timestamp') là trong vài giây nếu không sử dụng 'from_unixtime (timestamp_value DIV 1000)' – narush

+0

Tôi chỉ nhận được thời gian cho đến thứ hai nhưng tôi cũng muốn ms. Làm thế nào để làm điều đó ? – Avinash

4

Với các phiên bản gần đây hơn của Hive và SparkSQL, kiểu dữ liệu của tùy chọn nhập ngày và kiểu có sẵn. Sau nên làm việc trong Hive cũng như Spark SQL

SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable 
2

Nếu bạn cần phải chuyển đổi ngày ở định dạng tùy chỉnh, sử dụng này:

select date_format(from_unixtime(epoch_datetime),'yyyMM') as formatted_date from myHiveTable; 


đó sẽ trở lại ngày như nămTháng ví dụ 201708

0

Thêm truy vấn này vào danh sách nơi timestamp cần phải được chuyển đổi sang chuỗi ngày yyyy-MM-dd cho một phân vùng chuỗi:

hive> select date_format(from_unixtime(epoch_datetime), 'yyyy-MM-dd') as day from table_name limit 20; 

-- If required, remove the millis precision for timestamps 
hive> select date_format(from_unixtime(cast(epoch_datetime/1000 as bigint)), 'yyyy-MM-dd') as day from table_name limit 20; 
Các vấn đề liên quan