सवाल एसक्यूएल जैसे हाइव सम्मिलित क्वेरी


मैं हाइव करने के लिए नया हूं, और जानना चाहता हूं कि एचआईवी टेबल में डेटा डालने के लिए वैसे भी है या नहीं। मैं अपने डेटा को हाइव में डालना चाहता हूं

INSERT INTO tablename VALUES (value1,value2..)

मैंने पढ़ा है कि आप फ़ाइल से डेटा को हाइव टेबल में लोड कर सकते हैं या आप एक टेबल से डेटा को हाइव टेबल में आयात कर सकते हैं लेकिन एसक्यूएल में डेटा को जोड़ने का कोई तरीका है?


44
2017-07-02 12:20


मूल




जवाब:


यहां कुछ जवाब हाइव 0.14 के रूप में पुराने हैं

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingvaluesintotablesfromSQL

सिंटैक्स का उपयोग करके अब सम्मिलित करना संभव है जैसे कि:

CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2));

INSERT INTO TABLE students
  VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);

78
2017-07-27 14:55



यह वास्तव में शीर्ष (स्वीकृत) उत्तर होना चाहिए। - xenocyon
@mattinbits: मैं एक कॉलम के लिए एक अनुक्रम-जेनरेट नंबर और एक अन्य कॉलम के लिए टाइमस्टैंप डालने का प्रयास कर रहा हूं। टाइमस्टैम्प के लिए, मैंने डालने के कथन में "from_unixtime (unix_timestamp ())" की कोशिश की। मुझे "SemanticException [ERROR 10293] मिला: सम्मिलित मानों के लिए temp फ़ाइल बनाने में असमर्थ TOK_FUNCTION प्रकार का अभिव्यक्ति डालने / मानों में समर्थित नहीं है"। मुझे अनुक्रम संख्या पीढ़ी कैसे प्राप्त हो सकता है इसका एक स्पष्ट विचार नहीं मिल रहा है। क्या आप कृपया कुछ इनपुट प्रदान कर सकते हैं कि मैं दोनों कैसे प्राप्त कर सकता हूं? मैं हाइव 1.1.0 का उपयोग कर रहा हूँ। धन्यवाद। - Marco99
@ मार्को 99 आपको इसे एक नया सवाल उठाना चाहिए - mattinbits
आपके समय के लिए धन्यवाद। मैंने कुछ दिन पहले एक सवाल उठाया था। कृपया इस लिंक को ढूंढें: stackoverflow.com/questions/39121524/... - Marco99


आप टेबल में शाब्दिक मान डालने के लिए तालिका उत्पन्न करने वाले फ़ंक्शन स्टैक का उपयोग कर सकते हैं।

सबसे पहले आपको एक डमी टेबल की आवश्यकता होती है जिसमें केवल एक पंक्ति होती है। आप इसे सीमा की मदद से उत्पन्न कर सकते हैं।

CREATE TABLE one AS
SELECT 1 AS one
FROM any_table_in_your_database
LIMIT 1;

अब आप इस तरह के शाब्दिक मूल्यों के साथ एक नई तालिका बना सकते हैं:

CREATE TABLE my_table AS
SELECT stack(3
  , "row1", 1
  , "row2", 2
  , "row3", 3
) AS (column1, column2)
FROM one
;

ढेर का पहला तर्क उन पंक्तियों की संख्या है जो आप उत्पन्न कर रहे हैं।

आप किसी मौजूदा तालिका में मान भी जोड़ सकते हैं:

INSERT INTO TABLE my_table
SELECT stack(2
  , "row4", 1
  , "row5", 2
) AS (column1, column2)
FROM one
;

16
2017-09-20 08:55





अद्वितीय 2 सुझाव का थोड़ा बेहतर संस्करण नीचे है:

insert overwrite table target_table
select * from 
(
select stack(
    3,                 # generating new table with 3 records
    'John', 80,        # record_1
    'Bill', 61         # record_2
    'Martha', 101      # record_3
    ) 
) s;

जो पहले से बाहर निकलने वाली तालिका का उपयोग कर हैक की आवश्यकता नहीं है।


11
2018-03-04 15:34



चुनिंदा स्टैक के बाहर आपको एक चुनिंदा कथन जोड़ने की आवश्यकता क्यों है, क्या यह आवश्यक है? - ryan


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

मेरे पास demo.txt नाम की एक फ़ाइल है जिसमें 2 लाइनें हैं:

ABC
XYZ

एक टेबल बनाएं और इस फ़ाइल को इसमें लोड करें

hive> create table demo(foo string);
hive> load data inpath '/demo.txt' into table demo;

अब, अगर मैं इस टेबल पर एक चयन करता हूं तो यह मुझे देगा:

hive> select * from demo;                        
OK    
ABC    
XYZ

मान लीजिए, मेरे पास demo2.txt नाम की एक और फ़ाइल है जिसमें निम्न है:

PQR

और मैं ओवरराइट का उपयोग किये बिना इस टेबल पर फिर से लोड करता हूं,

hive> load data inpath '/demo2.txt' into table demo;

अब, अगर मैं अब एक चयन करता हूं, तो यह मुझे देगा,

hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH


5
2017-07-03 14:52





आप नीचे दृष्टिकोण का उपयोग कर सकते हैं। इसके साथ, आपको क्रमशः आगे चयन और लोड के लिए अस्थायी तालिका या txt / csv फ़ाइल बनाने की आवश्यकता नहीं है।

INSERT INTO TABLE tablename SELECT value1,value2 FROM tempTable_with_atleast_one_records LIMIT 1.

कहा पे tempTable_with_atleast_one_records कम से कम एक रिकॉर्ड के साथ कोई मेज है।

लेकिन इस दृष्टिकोण के साथ समस्या यह है कि यदि आपके पास INSERT कथन है जो एक से अधिक पंक्तियों को सम्मिलित करता है।

INSERT INTO yourTable values (1 , 'value1') , (2 , 'value2') , (3 , 'value3') ;

फिर, आपको प्रत्येक पंक्तियों के लिए अलग INSERT हाइव स्टेटमेंट होना चाहिए। निचे देखो।

INSERT INTO TABLE yourTable SELECT 1 , 'value1' FROM tempTable_with_atleast_one_records LIMIT 1;
INSERT INTO TABLE yourTable SELECT 2 , 'value2' FROM tempTable_with_atleast_one_records LIMIT 1;
INSERT INTO TABLE yourTable SELECT 3 , 'value3' FROM tempTable_with_atleast_one_records LIMIT 1;

5
2017-11-11 07:09





नहीं यह INSERT INTO tablename VALUES (x,y,z) सिंटैक्स वर्तमान में हाइव में समर्थित नहीं है।


3
2017-07-02 12:48



क्या वहां एक तरीका है ताकि मैं अपनी तालिका में डेटा जोड़ सकूं जैसा कि हम एसक्यूएल में करते हैं। - Y0gesh Gupta
INSERT INTO tablename SELECT ... समर्थित है, इसलिए आप नए डेटा को एक अस्थायी तालिका में डाल सकते हैं और फिर वहां से चयन करके सम्मिलित कर सकते हैं। - Lukas Vermeer
मैं जावा क्लाइंट के माध्यम से हाइव में डेटा जोड़ना चाहता हूं, क्या यह काम करेगा यदि मैं जावा में एक अस्थायी डेटा टेबल बनाता हूं और एक डालने लिखता हूं और केवल अपने जावा क्लाइंट में क्वेरी का चयन करता हूं? - Y0gesh Gupta
यदि आप जावा का उपयोग कर रहे हैं, तो फ़ाइल को एचडीएफएस में सीधे क्यों न जोड़ें? हाइव इस तरह की चीज़ के लिए वास्तव में उपयुक्त नहीं है। - Lukas Vermeer


हां आप सम्मिलित कर सकते हैं लेकिन एसक्यूएल के समान नहीं।

एसक्यूएल में हम पंक्ति स्तर डेटा डाल सकते हैं, लेकिन यहां आप फ़ील्ड (कॉलम) द्वारा सम्मिलित कर सकते हैं।

इसके दौरान आपको यह सुनिश्चित करना होगा कि लक्ष्य तालिका और क्वेरी में समान डेटाटाइप और कॉलम की समान संख्या होनी चाहिए।

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

CREATE TABLE test(stu_name STRING,stu_id INT,stu_marks INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

INSERT OVERWRITE TABLE test SELECT lang_name, lang_id, lang_legacy_id FROM export_table;

2
2018-03-04 11:07





के पूरे डेटा को सम्मिलित करने के लिए table2 में table1। नीचे एक प्रश्न है:

INSERT INTO TABLE table1 SELECT * FROM table2; 

2
2017-07-12 09:40





आप एकल रिकॉर्ड डालने के लिए सम्मिलित नहीं कर सकते हैं। यह हाइव द्वारा समर्थित नहीं है। आप उन सभी नए रिकॉर्ड्स डाल सकते हैं जिन्हें आप फ़ाइल में सम्मिलित करना चाहते हैं और उस फ़ाइल को हाइव में एक अस्थायी तालिका में लोड करें। फिर सम्मिलित ओवरराइट का उपयोग करें .. चयन करें उन पंक्तियों को अपनी मुख्य हाइव तालिका के नए विभाजन में डालें। यहां की बाधा आपकी मुख्य तालिका को पूर्व विभाजित करना होगा। यदि आप विभाजन का उपयोग नहीं करते हैं तो आपकी पूरी तालिका इन नए रिकॉर्ड्स के साथ बदल दी जाएगी।


1
2017-07-03 06:11



पूरी तरह से सही नहीं है। "INSERT INTO मौजूदा डेटा को सामंजस्य में रखते हुए तालिका या विभाजन में जोड़ देगा। (नोट: सिंटैक्स में INSERT केवल संस्करण 0.8 में उपलब्ध है)" cwiki.apache.org/confluence/display/Hive/... - Lukas Vermeer


कुछ शर्त के साथ testlog तालिका में डेटा डालने के लिए निम्न आदेश दर्ज करें:

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;

1
2017-11-22 14:29





मुझे लगता है कि ऐसे परिदृश्यों में आपको एचबीएएसई का उपयोग करना चाहिए जो इस तरह के सम्मिलन की सुविधा प्रदान करता है लेकिन यह किसी भी SQL प्रकार की क्वेरी भाषा प्रदान नहीं करता है। आपको एचबीएएसई के जावा एपीआई का उपयोग इस तरह के सम्मिलन के लिए पुट विधि की तरह करने की आवश्यकता है। इसके अलावा एचबीएएसई कॉलम उन्मुख नो-एसक्यूएल डेटाबेस है।


0
2017-07-03 12:50