2010-11-01 37 views
28

我正在寻找Hive中的内置字符串拆分函数? 例如如果字符串是Hive是否具有字符串拆分功能?

A | B | C | d |电子

然后我想有像 阵列分裂的功能(字符串输入,字符分隔符)

使得我回来[A, B,C,d,E]。

Hive中是否存在这样的内置分割函数? 我只能看到regexp_extract和regexp_replace。我很想看到一个indexOf()和split() 字符串函数。

感谢

阿贾伊

回答

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 2015-01-15 12:42:38

+0

分号不在正则表达式元字符列表中(请参阅https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php)。因此,你应该能够使用';'代替 '\\;'。 – 2016-07-01 19:47:05

29

在蜂巢分裂另一个有趣的用例时,例如,在表中的列ipname有值“abc11.def.ghft.com”和你想拉“abc11”出:

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

是可以在'GROUP BY'中使用的分割,就像'select split(area,'[_]')[0],isp,pc_mobile,device,count(userip)from usemap_without_ptime ORDER BY split(area,'[_] ')[0],isp,pc_mobile,device' – timger 2012-12-21 08:19:44

+1

其实你必须把模式放在正则表达式中。应该是SELECT split(ipname,'\\。')[0] FROM tablename – Marlio 2014-10-20 07:22:53

0

只是澄清了Bkkbrad给出的答案。

我试过这个建议,但它不适合我。

例如,

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

制备:

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

但是,

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

产生所期望的结果:

["aa","bb"] 

包含元字符'|'在方括号内使其按字面意思进行解释,而不是作为元字符。

对于正则表达式的这种行为的阐述,请参阅:http://www.regular-expressions.info/charclass.html