2013-08-16 11 views
10

में मैं इंटरनेट पर एक बहुत खोज की, लेकिन जवाब नहीं मिला।स्थानीय समय UTC समय में रूपांतरित हाइव

मैं हाइव में कुछ क्वेरी लिख रहा हूँ: यहाँ मेरे सवाल है। मेरे पास यूटीसी टाइमस्टैम्प है और इसे यूटीसी समय में बदलना है, उदाहरण के लिए, टाइमस्टैम्प 1349049600 दिया गया है, मैं इसे यूटीसी समय में बदलना चाहता हूं जो 2012-10-01 00:00:00 है। हालांकि अगर मैं हाइव में निर्मित फ़ंक्शन from_unixtime(1349049600) का उपयोग करता हूं, तो मुझे स्थानीय पीडीटी समय 2012-09-30 17:00:00 मिलता है।

मुझे एहसास हुआ कि from_utc_timestamp(timestamp, string timezone) नामक एक अंतर्निहित फ़ंक्शन है। तब मैंने इसे from_utc_timestamp(1349049600, "GMT") की तरह कोशिश की, उत्पादन 1 9 70-01-16 06: 44: 09.6 है जो पूरी तरह से गलत है।

मैं स्थायी रूप से हाइव का समय क्षेत्र बदलने के लिए अन्य उपयोगकर्ताओं रहे हैं क्योंकि वहाँ नहीं करना चाहती। तो क्या कोई तरीका है कि मैं 134 9 0 9 600 से "2012-10-01 00:00:00" तक यूटीसी टाइमस्टैम्प स्ट्रिंग प्राप्त कर सकता हूं? बहुत बहुत धन्यवाद!!

उत्तर

-1

मैं currentmillis.com पर गया और वास्तव में सेकंड्स को महसूस किए बिना 1349049600 चिपकाया। और वास्तव में यह तिथि में 1 9 70-01-16 लौटा, जिसका मतलब है कि आपके द्वारा सुझाए गए फ़ंक्शन: से_utc_timestamp वास्तव में पहले पैरामीटर के रूप में मिलीसेकंड लेता है? शायद आप from_utc_timestamp(1349049600000, "GMT") के साथ फिर कोशिश कर सकते हैं?

+0

मैं वह भी लेकिन कोशिश की समय अभी भी ठीक नहीं है ... मैं भी कह रही है कि हम एक 1.0 ('1349049600000 * 1.0') के साथ 1349049600000 गुणा करना चाहिए एक पोस्ट को देखा है, लेकिन काम नहीं कर रहा है, फिर भी आपकी मदद के लिए either..thanks! – Iam619

+0

क्या आप इसके बजाय_utc_timestamp करने का प्रयास कर सकते हैं? मेरा मानना ​​है कि इसका एक ही वाक्यविन्यास है। – Sandman

12

जहाँ तक मैं कह सकता हूं, from_utc_timestamp() को दिनांक स्ट्रिंग तर्क की आवश्यकता है, जैसे "2014-01-15 11:21:15", यूनिक्स सेकंड-से-युग मूल्य नहीं। यही कारण है कि जब आप एक पूर्णांक पास करते हैं तो यह अजीब परिणाम दे रहा है? मेरे मामले में "America/Montreal" -

केवल हाइव समारोह है कि युग सेकंड के साथ संबंधित from_unixtime() जो आप सर्वर समय क्षेत्र, जो मैं /etc/sysconfig/clock में पाया में समय स्टांप स्ट्रिंग देता हो रहा है।

तो तुम to_utc_timestamp(from_unixtime(1389802875),'America/Montreal') के माध्यम से एक यूटीसी टाइमस्टैम्प स्ट्रिंग प्राप्त कर सकते हैं, और फिर from_utc_timestamp()

यह सब बहुत दर्दनाक लगता है के साथ अपने लक्ष्य समय क्षेत्र में बदलने का, विशेष रूप से अपने एसक्यूएल में अपने सर्वर TZ तार करने के लिए। यदि from_unixtime_utc() फ़ंक्शन या कुछ था तो जीवन आसान होगा।


अद्यतन: from_utc_timestamp() एक मिली सेकंड तर्क के साथ-साथ एक स्ट्रिंग के साथ सौदा है, लेकिन फिर करता रूपांतरण गलत हो जाता है।

जब मैं from_utc_timestamp(1389802875000, 'America/Los_Angeles') कोशिश करता हूं तो यह "2014-01-15 03:21:15" देता है जो गलत है।
सही जवाब "2014-01-15 08:21:15" है जो आप के माध्यम से from_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')

+1

मैं हाइव 0.10 पर हूं। यह इस बग की तरह दिखता है: https://issues.apache.org/jira/browse/HIVE-2867 – patricksurry

2

(मॉन्ट्रियल में एक सर्वर के लिए) प्राप्त कर सकते हैं इस तरह यह प्रयोग करें:

to_utc_timestamp(from_unixtime(timestamp),"PDT")

+2

यह एक वोट दें मिला है, लेकिन ऐसा लगता है यह 'होना चाहिए from_utc_timestamp (from_unixtime (टाइमस्टैम्प)," पीडीटी ") लग रहा है' –

+0

@ChrisA। उपयोगकर्ता समय को यूटीसी टाइमज़ोन में कनवर्ट करना चाहता है, यही कारण है कि यह फ़ंक्शन। –

+2

आप कोड हैं कुछ समस्याएं हैं। (1) एक प्रबल टाइपो (जैसे '..._ timezone' -।>' ..._ timestamp') और (2) '" पीडीटी "' समयक्षेत्र काम नहीं करता। यह कोड 'to_utc_timestamp (from_unixtime (टाइमस्टैम्प)," पीएसटी ") 'मेरे लिए काम करता है। – swdev

1

यह उदाहरण एक hardwired होने की समस्या के लिए एक समाधान प्रदान करता आपके हाइव कोड में सिस्टम समय क्षेत्र TZ का मूल्य। यह ओपनजेडीके जावा संस्करण 1.6 के साथ, सेंटोस पर्यावरण में हाइव 0.10.0 का उपयोग करके चलाया गया था। क्योंकि इसमें समय-सारिणी शामिल है कि उन सटीक सॉफ़्टवेयर संशोधन महत्वपूर्ण हो सकते हैं। वर्तमान में सिस्टम ईडीटी में काम कर रहा है। तालिका tblFiniteZahl एक डुएल की तरह है लेकिन लगभग दस लाख पंक्तियों के साथ, आपने अनुमान लगाया है, सीमित संख्याएं। लेकिन आप कम से कम 1 पंक्ति के साथ किसी भी तालिका को प्रतिस्थापित कर सकते हैं।यह चाल स्थानीय टाइमज़ोन में समय को प्रारूपित करने के लिए है, लेकिन टाइमज़ोन को कैप्चर करने के लिए जेड प्रारूप का उपयोग करें और उसके बाद 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 
; 

परिणाम

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 

यह दिखाता है कि to_utc_timestamp EDT का एक दूसरा तर्क ले करता है।

3

अरे सिर्फ मैं "को स्वचालित करने के लिए" प्रणाली समयक्षेत्र आजमाने का सुझाव देते हैं, यहाँ एक छोटे से जोड़ना चाहते थे। तो स्थिर

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

के बजाय इस एक शॉट

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

दें यह सिर्फ "from_unixtime" की स्ट्रिंग उत्पादन प्रारूप का उपयोग करता समयक्षेत्र स्ट्रिंग वापस जाने के लिए (लोअरकेस जेड)

संबंधित मुद्दे