डेटाबेस से N फ़ील्ड लें, और फिर उन्हें एक साथ संयोजित करें और डिस्प्ले को अलग करने के लिए "," का उपयोग करें। सबसे पहले, मैंने इसे संसाधित करने के लिए CONCAT() का उपयोग करने के बारे में सोचा, लेकिन यह अप्रत्याशित था, इसमें CONCAT_WS() का उल्लेख किया गया था मैनुअल, जिसका उपयोग करना बहुत आसान है।
CONCAT_WS(separator, str1, str2,...)
यह CONCAT() का एक विशेष रूप है। पहला पैरामीटर शेष पैरामीटर के बीच सीमांकक है। सीमांकक शेष पैरामीटर के समान स्ट्रिंग हो सकता है, यदि सीमांकक NULL है, तो रिटर्न मान भी NULL होगा सीमांकक पैरामीटर के बाद किसी भी शून्य और खाली स्ट्रिंग को जम्प करेगा, श्रेणीबद्ध की जा रही स्ट्रिंग के बीच सीमांकक जोड़ा जाएगा।
एक सरल उदाहरण इस प्रकार है:
mysql> SELECT CONCAT_WS(",","First name","Second name","Last Name"); -> 'First name,Second name,Last Name' mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name"); -> 'First name,Last Name'
हाइव में संग्रह-संबंधित कार्यों में कलेक्ट_लिस्ट और कलेक्ट_सेट शामिल हैं।
वे दोनों ग्रुपिंग में एक कॉलम को एक सरणी में परिवर्तित करते हैं और उसे वापस कर देते हैं। अंतर यह है कि Collect_list डुप्लिकेट को नहीं हटाता है, बल्कि Collect_set को हटाता है।
अपनी समझ को गहरा करने के लिए एक सरल प्रयोग करें और उपयोगकर्ताओं के दैनिक ऑन-डिमांड वीडियो के रिकॉर्ड को संग्रहीत करने के लिए एक प्रयोगात्मक तालिका बनाएं:
create table t_visit_video ( username string, video_name string ) partitioned by (day string) row format delimited fields terminated by ',';
स्थानीय फ़ाइल सिस्टम पर एक परीक्षण डेटा फ़ाइल बनाएँ:
张三,大唐双龙传 李四,天下无贼 张三,神探狄仁杰 李四,霸王别姬 李四,霸王别姬 王五,机器人总动员 王五,放牛班的春天 王五,盗梦空间
हाइव तालिका में डेटा लोड करें:
load data local inpath '/root/hive/visit.data' into table t_visit_video partition (day='20180516');
उपयोगकर्ता द्वारा समूहीकृत करें और हर दिन प्रत्येक उपयोगकर्ता द्वारा देखे गए सभी वीडियो के नाम पुनः प्राप्त करें:
select username, collect_list(video_name) from t_visit_video group by username ;
张三 ["大唐双龙传","神探狄仁杰"] 李四 ["天下无贼","霸王别姬","霸王别姬"] …………
हालाँकि, उपरोक्त क्वेरी परिणामों में एक समस्या है। क्योंकि फेयरवेल माई कॉन्क्यूबाइन बहुत अच्छा है, ली सी ने इसे दो बार देखा। इससे सीधे तौर पर देखे गए वीडियो की सूची में डुप्लिकेट आ जाते हैं, इसलिए डुप्लिकेशन को जोड़ा जाना चाहिए और कलेक्ट_सेट का उपयोग किया जाना चाहिए इसके और Collect_list के बीच अंतर यह है कि यह डुप्लिकेट हटा देगा:
select username, collect_set(video_name) from t_visit_video group by username;
张三 ["大唐双龙传","神探狄仁杰"] 李四 ["天下无贼","霸王别姬"] …………
फेयरवेल माई कॉन्सुबाइन ली सी के देखने के रिकॉर्ड में केवल एक बार दिखाई देता है, जिससे डी-डुप्लीकेशन का प्रभाव प्राप्त होता है।
प्रतिबंधों द्वारा समूह को तोड़ें
आप ग्रुप बाय के प्रतिबंधों को तोड़ने के लिए कलेक्ट का भी उपयोग कर सकते हैं। हाइव में, ग्रुप बाय के बारे में पूछताछ करते समय, यह आवश्यक है कि चयन के बाद दिखाई देने वाले कॉलम ग्रुप बाय के बाद दिखाई देने चाहिए, अर्थात, चयन कॉलम को इस रूप में उपयोग किया जाना चाहिए। समूहीकरण का आधार, लेकिन कभी-कभी हम ए के अनुसार समूह बनाना चाहते हैं और फिर प्रत्येक समूह में यादृच्छिक रूप से एक बी निकालते हैं, हम उपयोगकर्ता द्वारा समूह बनाते हैं, और फिर उसके द्वारा देखे गए वीडियो का नाम यादृच्छिक रूप से चुनते हैं:
select username, collect_list(video_name)[0] from t_visit_video group by username;
张三 大唐双龙传 李四 天下无贼 …………
video_name एक ग्रुपिंग कॉलम नहीं है, और इस कॉलम का डेटा अभी भी पुनर्प्राप्त किया जा सकता है।
अंश संक्षेप में:
HTTPS://wuwuwu.cn ब्लॉग on.com/loco有/archive/2006/10/28/542751.HTML
HTTPS://wuwuwu.cn ब्लॉग on.com/Cao Cao11001100/fear/9043946.HTML