Hive 有字符串拆分功能吗?

Posted

技术标签:

【中文标题】Hive 有字符串拆分功能吗?【英文标题】:Does Hive have a String split function? 【发布时间】:2011-05-03 05:36:43 【问题描述】:

我正在寻找 Hive 中的内置字符串拆分功能?例如如果字符串是:

A|B|C|D|E

那我想有这样的功能:

array<string> split(string input, char delimiter)

这样我就回来了:

[A,B,C,D,E]

Hive 中是否存在这样的内置拆分功能。

我只能看到regexp_extractregexp_replace。我很想看到indexOf()split() 字符串函数。

【问题讨论】:

【参考方案1】:

确实存在基于正则表达式的拆分功能。没有在in the tutorial列出,但在the language manual on the wiki列出:

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

在您的情况下,分隔符“|”作为正则表达式具有特殊含义,因此应将其称为“\\|”。

【讨论】:

分号不在正则表达式元字符列表中(参见,例如,hscripts.com/tutorials/regular-expression/…)。因此,您应该只能使用 ';'而不是 '\\;'。 页面不存在了:cwiki.apache.org/confluence/display/HADOOP2/Hive/LanguageManual/… 最新的语言手册链接:cwiki.apache.org/confluence/display/Hive/…【参考方案2】:

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

我尝试了这个建议,但它对我不起作用。

例如,

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

制作:

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

但是,

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

产生了预期的结果:

["aa","bb"]

包括元字符“|”方括号内的内容会按原意按字面意思解释,而不是元字符。

有关正则表达式的这种行为的详细说明,请参阅:http://www.regular-expressions.info/charclass.html

【讨论】:

【参考方案3】:

另一个在 Hive 中拆分的有趣用例是,例如,当表中的列 ipname 具有值“abc11.def.ghft.com”并且您想要提取“abc11”时:

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

【讨论】:

是拆分可以在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 实际上您必须将模式放入正则表达式中。应该是 SELECT split(ipname,'\\.')[0] FROM tablename

以上是关于Hive 有字符串拆分功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于在Hive中将特定字符分隔的字符串拆分成多行的应用

如何使用横向视图将分隔字符串拆分为 Hive 中的多行

如何在 Hive 中将一列拆分为两列

在 Hive/Presto 中将文件路径拆分为其组成路径

xslt 有 split() 功能吗?

您知道如何将字符串列表拆分为不同的变量吗?