HIVE लिपियों में चर कैसे सेट करें


102

मैं SET varname = valueHive QL में SQL समकक्ष के लिए देख रहा हूँ

मुझे पता है कि मैं ऐसा कुछ कर सकता हूं:

SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE

लेकिन तब मुझे यह त्रुटि मिलती है:

चरित्र '@' यहां समर्थित नहीं है


दुर्भाग्य से, एक स्ट्रिंग चर सेट करने का कोई सुरक्षित तरीका नहीं है क्योंकि यदि कोई चर को सेट किए बिना क्वेरी चलाता है, तो स्ट्रिंग बस स्ट्रिंग के रूप में चर कॉल का उपयोग करेगी। :(
कॉम्बिनेटरवादी

जवाबों:


201

आपको चर प्रतिस्थापन के लिए विशेष हाइवेंकफ का उपयोग करने की आवश्यकता है । जैसे

hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'

इसी तरह, आप कमांड लाइन पर पास कर सकते हैं:

% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql

ध्यान दें कि एनवी और सिस्टम चर भी हैं, इसलिए आप ${env:USER}उदाहरण के लिए संदर्भ ले सकते हैं ।

कमांड लाइन से सभी उपलब्ध चर देखने के लिए, रन करें

% hive -e 'set;'

या हाइव प्रॉम्प्ट से, भागो

hive> set;

अद्यतन: मैंने हाइवार चर का उपयोग करना शुरू कर दिया है , उन्हें hql स्निपेट में डालकर मैं hive CLI से sourceकमांड का उपयोग कर शामिल कर सकता हूं (या कमांड लाइन से -i विकल्प पास कर सकता हूं )। यहाँ लाभ यह है कि चर का उपयोग तब या उसके बिना हाइववार उपसर्ग के साथ किया जा सकता है, और वैश्विक बनाम स्थानीय उपयोग के लिए कुछ अनुमति देता है।

तो, मान लें कि कुछ setup.hql है जो एक टैबलनेम वैरिएबल सेट करता है:

set hivevar:tablename=mytable;

फिर, मैं छत्ते में ला सकता हूं:

hive> source /path/to/setup.hql;

और क्वेरी में उपयोग करें:

hive> select * from ${tablename}

या

hive> select * from ${hivevar:tablename}

मैं एक "स्थानीय" टैबलेन भी सेट कर सकता था, जो $ {टैबलेनम} के उपयोग को प्रभावित करेगा, लेकिन $ {हाइववर: टैबलेनमे} को नहीं।

hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'

बनाम

hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'

शायद CLI से बहुत अधिक मतलब नहीं है, लेकिन स्रोत का उपयोग करने वाली फ़ाइल में hql हो सकता है , लेकिन बाकी स्क्रिप्ट में उपयोग करने के लिए कुछ चर "स्थानीय रूप से" सेट करें।


1
यह कमांड लाइन से एक पैरामीटर पास कर रहा है जो मैं कर्मसफ़ेयर में प्रश्नों को विकसित कर रहा हूं और भीख में कुछ प्रतियोगियों को सेट करने की आवश्यकता है ताकि मैं अपनी स्क्रिप्ट में 10 बार हार्ड कोड की तारीख न करूं। क्या ऐसा कुछ संभव है?
user1678312

दोनों तरीकों से काम करता है, यदि आप करते हैं तो set CURRENT_DATE='2012-09-16';आप बाद में इसका उल्लेख कर सकते हैं${hiveconf:CURRENT_DATE}
libjack

1
अगर मेरे पास एक साथ कई हाइव जॉब हैं तो यह कैसे काम करता है? क्या वे एक-दूसरे से मूल्यों को खत्म करेंगे? स्वचालन में मैं कुछ SET कथनों के साथ इसे प्रस्तुत करके एक HQL फ़ाइल का निर्माण कर रहा हूँ। मैं यह सुनिश्चित करना चाहता हूं कि क्या मैं एक ही समय में दो काम प्रस्तुत करता हूं जो समान चर नामों का उपयोग करते हैं, एक नौकरी दूसरी नौकरी से मान नहीं उठाएगी। यहाँ शब्दार्थ आपके उत्तर से स्पष्ट नहीं हैं।
13

5
यह हाइव सर्वर पर मेरे लिए काम करता है। हालाँकि, मैंने IntelliJ में स्थानीय मशीन पर कुछ एकीकरण परीक्षण सेटअप किए हैं। मैं इस तरह से चर का उपयोग करने की कोशिश करते समय त्रुटि प्राप्त करता रहता हूं:FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
chepukha

1
@DatabaseCoder मेरे ज्ञान के लिए, ऐसा कुछ भी काम नहीं करेगा। जब भी मुझे ऐसा कुछ चाहिए, मुझे पहली क्वेरी करनी होगी और फिर "--hiveconf" से गुजरना होगा
libjack

21

यहाँ अधिकांश उत्तर ने चर को संग्रहीत करने के लिए hiveconfया तो hivevarनाम या स्थान का उपयोग करने का सुझाव दिया है । और वे सभी उत्तर सही हैं। हालांकि, एक और नाम स्थान है।

namespacesचर रखने के लिए कुल तीन उपलब्ध हैं।

  1. hiveconf - hive इस के साथ शुरू हुआ, सभी हाइव कॉन्फ़िगरेशन को इस मान के भाग के रूप में संग्रहीत किया जाता है। प्रारंभ में, चर प्रतिस्थापन हाइव का हिस्सा नहीं था और जब इसे पेश किया गया, तो सभी उपयोगकर्ता-परिभाषित चर भी इस के हिस्से के रूप में संग्रहीत किए गए थे। जो निश्चित रूप से एक अच्छा विचार नहीं है। इसलिए दो और नामस्थान बनाए गए।
  2. hivevar : उपयोगकर्ता चर को संग्रहीत करने के लिए
  3. सिस्टम : सिस्टम वेरिएबल्स को स्टोर करने के लिए।

और इसलिए यदि आप एक क्वेरी (यानी दिनांक या product_number) के हिस्से के रूप में एक चर का भंडारण कर रहे हैं, तो आपको hivevarनाम स्थान का उपयोग करना चाहिए, न कि hiveconfनाम स्थान का।

और इस तरह से यह काम करता है।

hiveconf अभी भी डिफ़ॉल्ट नाम स्थान है , इसलिए यदि आप कोई नामस्थान प्रदान नहीं करते हैं तो यह आपके चर को hiveconf नामस्थान में संग्रहीत करेगा।

हालाँकि, जब किसी चर का जिक्र आता है, तो यह सच नहीं है। डिफ़ॉल्ट रूप से यह हिवर नामस्थानों को संदर्भित करता है । भ्रामक, सही? यह निम्नलिखित उदाहरण से स्पष्ट हो सकता है।

यदि आप नीचे बताए अनुसार नाम स्थान प्रदान नहीं करते हैं, तो चर varको hiveconfनाम स्थान में संग्रहीत किया जाएगा ।

set var="default_namespace";

तो, इसे एक्सेस करने के लिए आपको hiveconf नाम स्थान निर्दिष्ट करने की आवश्यकता है

select ${hiveconf:var};

और यदि आप नाम स्थान प्रदान नहीं करते हैं, तो यह आपको नीचे बताई गई एक त्रुटि देगा, इसका कारण यह है कि डिफ़ॉल्ट रूप से यदि आप किसी चर तक पहुँचने की कोशिश करते हैं तो यह hivevarकेवल नाम स्थान पर जांचता है । और hivevarनाम का कोई चर नहीं हैvar

select ${var}; 

हमने स्पष्ट रूप से hivevarनाम स्थान प्रदान किया है

set hivevar:var="hivevar_namespace";

जैसा कि हम नाम स्थान प्रदान कर रहे हैं यह काम करेगा।

select ${hivevar:var}; 

और डिफ़ॉल्ट के रूप में, एक चर को संदर्भित करने के दौरान उपयोग किए जाने वाले कार्यक्षेत्र है hivevar, निम्नलिखित भी काम करेगा।

select ${var};

7

क्या आपने डॉलर चिह्न और कोष्ठक का उपयोग करने की कोशिश की है :

SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';

यह मेरे लिए एकमात्र काम करने वाला उत्तर है। मेरे अम्बारी हाइव इंटरफ़ेस में उद्धरण आवश्यक हैं।
लॉरेंस कोपेनोल

दो चीजें हैं- हाइवार और हाइवेंकफ- दोनों को यहां
राहुल शर्मा

3

दो आसान तरीके:

छत्ता आत्मविश्वास का उपयोग करना

hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';

हाइव वैर का उपयोग करना

अपने सीएलआई सेट वेरिएंट पर और फिर उन्हें हाइव में उपयोग करें

set hivevar:USER_NAME='FOO';

hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';

प्रलेखन: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstoration


2

एक बात ध्यान रखने योग्य है कि तार को फिर से सेट करना है और उन्हें वापस करना है। आपको यह सुनिश्चित करना होगा कि उद्धरण टकराने न हों।

 set start_date = '2019-01-21';
 select ${hiveconf:start_date}; 

जब दिनांक सेट करते हैं तो उन्हें कोड में संदर्भित करते हैं क्योंकि तार संघर्ष कर सकते हैं। यह ऊपर दिए गए start_date के साथ काम नहीं करेगा।

 '${hiveconf:start_date}'

हमें क्वेरी में उनके बारे में जिक्र करते समय स्ट्रिंग्स के लिए दो बार सिंगल या डबल कोट्स न सेट करने का ध्यान रखना होगा।


2

बस अगर किसी को क्लाइव के माध्यम से हाइव क्वेरी को पैरामीटर करने की आवश्यकता होती है।

उदाहरण के लिए:

hive_query.sql

SELECT * FROM foo WHERE day >= '${hivevar:CURRENT_DATE}'

अब cli से sql फ़ाइल के ऊपर निष्पादित करें:

hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql

0

इस विधि का प्रयास करें:

set t=20;
select *
from myTable
where age > '${hiveconf:t}'; 

यह मेरे प्लेटफॉर्म पर अच्छा काम करता है।


0

आप शेल स्क्रिप्ट निर्यात CURRENT_DATE = "2012-09-16" में वैरिएबल का निर्यात कर सकते हैं

फिर hiveql में आपको सेलेक्ट * FROM foo WHERE दिन = = '$ {env: CURRENT_DATE}' पसंद है


-7

आप किसी अन्य क्वेरी के आउटपुट को एक चर में संग्रहीत कर सकते हैं और बाद में आप अपने कोड में उसी का उपयोग कर सकते हैं:

set var=select count(*) from My_table;
${hiveconf:var};

आप गलत हैं, My_table से गिनती (*) का चयन करें; var में संग्रहीत किया जाएगा ।
इल्या बिस्ट्रोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.