2010-11-01 10 views
28

मैं हाइव में एक निर्मित स्ट्रिंग स्प्लिट फ़ंक्शन की तलाश में हूं? ईजी। बी | | C | यदि स्ट्रिंगक्या हाइव स्ट्रिंग स्प्लिट फ़ंक्शन है?

एक है डी | ई

तो मैं जैसे सरणी विभाजन एक समारोह (स्ट्रिंग इनपुट, चार सीमांकक)

ताकि मैं वापस पाने के [एक करना चाहते हैं, बी, सी, डी, ई]।

क्या ऐसा अंतर्निहित विभाजन कार्य हाइव में मौजूद है। मैं केवल regexp_extract और regexp_replace देख सकता हूं। मुझे इंडेक्सऑफ() और विभाजन() स्ट्रिंग फ़ंक्शंस देखना अच्छा लगेगा।

धन्यवाद

अजय

उत्तर

37

वहाँ एक विभाजन नियमित अभिव्यक्ति के आधार पर समारोह मौजूद नहीं है। यह in the tutorial सूचीबद्ध है नहीं, लेकिन यह the language manual on the wiki पर सूचीबद्ध है:

split(string str, string pat) 
    Split str around pat (pat is a regular expression) 

आपके मामले में, सीमांकक "|" एक नियमित अभिव्यक्ति के रूप में एक विशेष अर्थ नहीं है, तो यह "\\|" के रूप में भेजा जाना चाहिए।

+1

और अर्धविराम क्या? जब मैं '\\;' का उपयोग करता हूं हाइव यहां देखें EOF ... – herder

+0

अर्धविराम रेगेक्स मेटाएक्टेक्टर्स की सूची में नहीं है (देखें, उदा।, https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php)। इस प्रकार, आपको बस ';' का उपयोग करने में सक्षम होना चाहिए के बजाय '\\;'। –

29

हाइव में विभाजन के लिए एक और दिलचस्प USECASE है, उदाहरण के लिए, तालिका में किसी स्तंभ ipname एक मूल्य "abc11.def.ghft.com" है और आप बाहर निकलने के लिए "abc11" हैं:

SELECT split(ipname,'[\.]')[0] FROM tablename; 
+1

स्प्लिट 'ग्रुप बाय' में 'चुनिंदा विभाजन (क्षेत्र,' [_] ') [0], आईएसपी, पीसी_मोबाइल, डिवाइस, गिनती (यूजरिप) जैसे usemap_without_ptime द्वारा विभाजित किया जा सकता है विभाजित (क्षेत्र,' [_] ') [0], आईएसपी, पीसी_मोबाइल, डिवाइस' – timger

+1

असल में आपको पैटर्न को रेगेक्स में रखना होगा। चयन स्प्लिट (ipname, '\\।') [0] tablename से होना चाहिए – Marlio

0

बस Bkkbrad द्वारा दिए गए उत्तर पर एक स्पष्टीकरण।

मैंने इस सुझाव की कोशिश की और यह मेरे लिए काम नहीं किया।

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

split('aa|bb','\\|') 

उत्पादित:

["","a","a","|","b","b",""] 

लेकिन,

split('aa|bb','[|]') 

वांछित परिणाम का उत्पादन किया:

["aa","bb"] 

मेटाएक्टेक्टर '|' सहित स्क्वायर ब्रैकेट के अंदर इसे मेटाएक्टेक्टर के बजाए, सचमुच, व्याख्या के रूप में व्याख्या किया जा सकता है।

regexp के इस व्यवहार का विस्तार के लिए देखें: http://www.regular-expressions.info/charclass.html