2013-08-16 51 views
10

Tôi đã tìm kiếm rất nhiều trên Internet nhưng không thể tìm thấy câu trả lời. Đây là câu hỏi của tôi:Giờ địa phương Chuyển đổi thành giờ UTC Trong Hive

Tôi đang viết một số truy vấn trong Hive. Tôi có dấu thời gian UTC và muốn thay đổi thời gian thành UTC, ví dụ: dấu thời gian đã định 1349049600, tôi muốn chuyển đổi thời gian thành UTC là 2012-10-01 00:00:00. Tuy nhiên, nếu tôi sử dụng chức năng được tích hợp from_unixtime(1349049600) trong Hive, tôi nhận được thời gian PDT địa phương 2012-09-30 17:00:00.

Tôi nhận thấy có chức năng tích hợp được gọi là from_utc_timestamp(timestamp, string timezone). Sau đó, tôi đã thử nó như from_utc_timestamp(1349049600, "GMT"), đầu ra là 1970-01-16 06: 44: 09.6 là hoàn toàn không chính xác.

Tôi không muốn thay đổi múi giờ của Hive vĩnh viễn vì có những người dùng khác. Vậy có cách nào tôi có thể nhận chuỗi thời gian UTC từ 1349049600 đến "2012-10-01 00:00:00" không? Cảm ơn rất nhiều!!

Trả lời

-1

Tôi đã đến currentmillis.com và dán 1349049600 mà không nhận ra nó thực sự là giây. Và thực sự nó đã trả về ngày 1970-01-16 trong ngày, có nghĩa là hàm bạn đã đề xuất: from_utc_timestamp thực sự mất mili giây như tham số đầu tiên? Có thể bạn có thể thử lại với from_utc_timestamp(1349049600000, "GMT")?

+0

Tôi cố gắng đó quá nhưng thời gian vẫn không đúng ... Tôi thậm chí còn nhìn thấy một bài viết nói rằng chúng ta nên nhân 1349049600000 với một 1.0 ('1349049600000 * 1.0'), nhưng không hoạt động, hoặc..thanks cho sự giúp đỡ của bạn vẫn còn! – Iam619

+0

Thay vào đó, bạn có thể thử to_utc_timestamp không? Tôi tin rằng nó có cùng cú pháp. – Sandman

12

Theo như tôi có thể biết, from_utc_timestamp() cần một đối số chuỗi ngày, như "2014-01-15 11:21:15", không phải là giá trị giây-từ-thời đại. Đó có thể là lý do tại sao nó cho kết quả kỳ lạ khi bạn vượt qua một số nguyên?

Chức năng Hive chỉ giao dịch với thời đại giây có vẻ là from_unixtime() mang đến cho bạn một chuỗi dấu thời gian trong máy chủ múi giờ, mà tôi tìm thấy trong /etc/sysconfig/clock - "America/Montreal" trong trường hợp của tôi.

Vì vậy, bạn có thể nhận được một chuỗi dấu thời gian tính theo giờ UTC qua to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), và sau đó chuyển sang múi giờ mục tiêu của bạn với from_utc_timestamp()

Tất cả đều có vẻ rất torturous, đặc biệt là phải dây TZ máy chủ của bạn vào SQL của bạn. Cuộc sống sẽ dễ dàng hơn nếu có chức năng from_unixtime_utc() hoặc gì đó.


Cập nhật: from_utc_timestamp() không đối phó với một cuộc tranh luận giây milli cũng như một chuỗi, nhưng sau đó được chuyển đổi sai.

Khi tôi thử from_utc_timestamp(1389802875000, 'America/Los_Angeles'), nó cung cấp cho "2014-01-15 03:21:15" sai.
Câu trả lời đúng là "2014-01-15 08:21:15" mà bạn có thể nhận được (đối với một máy chủ tại Montreal) thông qua from_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')

+1

Tôi đang ở trên Hive 0.10. Điều này trông giống như lỗi này: https://issues.apache.org/jira/browse/HIVE-2867 – patricksurry

2

Sử dụng nó như thế này:

to_utc_timestamp(from_unixtime(timestamp),"PDT")

+2

Điều này có một upvote, nhưng có vẻ như nó phải là 'from_utc_timestamp (from_unixtime (dấu thời gian)," PDT ")' –

+0

@ Chris. Người dùng muốn chuyển đổi thời gian TO utc múi giờ, đó là lý do tại sao chức năng này. –

+2

Mã của bạn có một số vấn đề. (1) Một lỗi đánh máy nghiêm trọng (ví dụ: '..._ timezone' ->' ..._ timestamp') và (2) múi giờ '" PDT "' không hoạt động. Mã này 'to_utc_timestamp (from_unixtime (dấu thời gian)," PST ")' làm việc cho tôi. – swdev

1

Ví dụ này cung cấp một giải pháp cho vấn đề của việc có một Hardwired giá trị của múi giờ hệ thống TZ trong mã hive của bạn. Nó được chạy bằng cách sử dụng hive 0.10.0 trong môi trường Centos, với phiên bản java OpenJDK 1.6. Bởi vì nó liên quan đến việc thao tác thời gian, những bản sửa đổi phần mềm chính xác đó có thể quan trọng. Hiện tại, hệ thống đang hoạt động ở EDT. Bảng tblFiniteZahl giống như một DUAL nhưng với khoảng một triệu hàng, bạn đoán nó, các số hữu hạn. Nhưng bạn có thể thay thế bất kỳ bảng nào có ít nhất 1 hàng.Bí quyết là định dạng thời gian trong múi giờ địa phương nhưng sử dụng định dạng z để nắm bắt múi giờ và sau đó trích xuất giá trị đó khi chạy để chuyển sang hàm to_utc_timestamp.

select D1, 
     D1E, 
     D1L, 
     D1LT, 
     D1LZ, 
     to_utc_timestamp(D1LT, D1LZ) as D1UTC 
from (
select D1, 
     D1E, 
     D1L, 
     regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 1) as D1LT, 
     regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 2) as D1LZ 
from (
select D1, 
     D1E, 
     from_unixtime(D1E, 'yyyy-MM-dd HH:mm:ss z') as D1L 
from (
select D1, 
     unix_timestamp(D1,'yyyy-MM-dd HH:mm:ss Z') as D1E 
from (
select '2015-08-24 01:15:23 UTC' as D1 
from tblFiniteZahl 
limit 1 
    ) T1 
    ) T2 
    ) T3 
    ) T4 
; 

Kết quả là

D1 = 2015-08-24 01:15:23 UTC 
DT3 = 1440378923 
D1L = 2015-08-23 21:15:23 EDT 
D1LT = 2015-08-23 21:15:23 
D1LZ = EDT 
D1UTC = 2015-08-23 21:15:23 

này minh họa rằng to_utc_timestamp không mất một số thứ hai của EDT.

3

Hey chỉ muốn thêm một chút ở đây, tôi khuyên bạn nên cố gắng "tự động hóa" múi giờ của hệ thống. Vì vậy, thay vì tĩnh

#STATIC TZ deceleration  
to_utc_timestamp(from_unixtime(1389802875),'America/Montreal') 

này cung cấp cho một shot

#DYNAMIC TZ 
select to_utc_timestamp(from_unixtime(1389802875), from_unixtime(unix_timestamp(), "z")); 

này chỉ sử dụng định dạng đầu ra chuỗi "from_unixtime" để trở về chuỗi múi giờ (chữ thường z)

Các vấn đề liên quan