2012-08-06 13 views
5

में sysdate -1 प्राप्त करें क्या Hive में current date -1 प्राप्त करने का कोई तरीका है yesterdays date हमेशा? और इस प्रारूप में- 20120805?हाइव

आज के रूप में Aug 6th है

मैं इस तरह मेरी क्वेरी चला सकते हैं yesterday's date के लिए डेटा प्राप्त करने के लिए -

select * from table1 where dt = '20120805'; 

लेकिन जब मैं date_sub function साथ इस तरह से कर रही है की कोशिश की कल की तारीख के रूप में प्राप्त करने के लिए नीचे दी गई तालिका पर विभाजित है तिथि (डीटी) कॉलम।

select * from table1 where dt = date_sub(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(), 
'yyyyMMdd')) , 1)  limit 10; 

यह सभी विभाजनों में डेटा की तलाश में है? क्यूं कर? मैं अपनी क्वेरी में कुछ गलत कर रहा हूँ?

स्कैन किए गए पूरे टेबल से बचने के लिए मैं सबक्वायरी में मूल्यांकन कैसे कर सकता हूं?

उत्तर

10
कुछ

प्रयास करें की तरह:

select * from table1 
where dt >= from_unixtime(unix_timestamp()-1*60*60*24, 'yyyyMMdd'); 

SELECT convert(varchar,getDate()-1,112) 

इस क्वेरी का उपयोग करें

यह काम करता है यदि आपको कोई फर्क नहीं पड़ता कि हाइव पूरी तालिका स्कैन करता है। from_unixtime निर्धारणात्मक नहीं है, इसलिए हाइव में क्वेरी प्लानर आपके लिए अनुकूल नहीं होगा। कई मामलों के लिए (उदाहरण के लिए लॉग फाइलें), एक निर्धारिती विभाजन कुंजी निर्दिष्ट नहीं कर सकता है, इसलिए बहुत बड़ी हडूप नौकरी शुरू हो सकती है क्योंकि यह पूरी तालिका को स्कैन करेगा, न केवल दी गई विभाजन कुंजी के साथ पंक्तियों को।

यह आपके लिए मायने रखती हैं, तो आप एक अतिरिक्त विकल्प

$ hive -hiveconf date_yesterday=20150331 

साथ और स्क्रिप्ट या छत्ता टर्मिनल उपयोग

select * from table1 
where dt >= ${hiveconf:date_yesterday}; 

वैरिएबल का नाम कोई फर्क नहीं पड़ता में छत्ता शुरू कर सकते हैं, न ही मान करता है, आप यूनिक्स कमांड का उपयोग कर पूर्व दिनांक प्राप्त करने के लिए उन्हें इस मामले में सेट कर सकते हैं। ओपी

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d") 
1

mysql में:

select DATE_FORMAT(curdate()-1,'%Y%m%d'); 

sqlserver में:

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d'); 
+0

हाइव के बारे में क्या, जैसा सवाल स्पष्ट रूप से हाइव में एक ही काम करने के लिए उल्लेख किया गया है? – ferhan

+0

मुझे अपना जवाब संपादित किया गया था।उस क्वेरी को आज़माएं। –

+2

यह काम नहीं कर रहा है। मैंने अभी कोशिश की है और मुझे कुछ भी वापस नहीं मिल रहा है, – ferhan

1

के विशिष्ट मामले में ऐसा लगता है कि DATE_SUB प्रारूप yyyy-MM-dd में तारीख मान लिया गया है। तो आपको अपने प्रारूप में जाने के लिए कुछ और प्रारूप मैनिपुलेशन करना पड़ सकता है। इस प्रयास करें:

select * from table1 
where dt = FROM_UNIXTIME(
       UNIX_TIMESTAMP(
        DATE_SUB(
         FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd') 
        , 1) 
       ) 
      , 'yyyyMMdd')  limit 10; 
+0

'FROM_UNIXTIME (UNIX_TIMESTAMP(), 'yyyy-MM-dd')' 'current_date' के साथ प्रतिस्थापित किया जा सकता है –

0

इस का उपयोग करें:

select * from table1 where dt = date_format(concat(year(date_sub(current_timestamp,1)),'-', month(date_sub(current_timestamp,1)), '-', day(date_sub(current_timestamp,1))), 'yyyyMMdd') limit 10; 

यह आपके विभाजन का एक नियतात्मक परिणाम (एक स्ट्रिंग) दे देंगे।

मुझे पता है कि यह सुपर वर्बोज़ है।

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