如何在 HIVE 中提取字符串的一部分?
Posted
技术标签:
【中文标题】如何在 HIVE 中提取字符串的一部分?【英文标题】:How to extract part of a string in HIVE? 【发布时间】:2018-11-19 14:52:47 【问题描述】:我希望在 Hive 中执行此操作。以下是在 sql server 中工作的查询。
select LEFT('ENTERPRISE > DEMO', CHARINDEX('>', 'ENTERPRISE > DEMO') - 2)
基本上,我想提取字符串中>
左侧的所有字符。此外,在此 >
符号之前可以出现的字符数是可变的。
hive 中没有LEFT
函数。我怎样才能使用substr
或regexp_extract
来做这个?
【问题讨论】:
【参考方案1】:除了已经提供了regexp_extract
和substr()
+instr()
的解决方案,你还可以使用split()
:
hive> select split('ENTERPRISE > DEMO','>')[0];
OK
ENTERPRISE
Time taken: 0.099 seconds, Fetched: 1 row(s)
hive> select split('ENTERPRISE > DEMO','>')[1];
OK
DEMO
Time taken: 0.072 seconds, Fetched: 1 row(s)
如果要删除空格,请应用 trim():
hive> select trim(split('ENTERPRISE > DEMO','>')[0]);
OK
ENTERPRISE
或者你可以用任意数量的空格+'>'+任意数量的空格来分割。 split() 使用正则表达式,无需使用 trim():
hive> select trim(split('ENTERPRISE >DEMO',' *?> *?')[0]);
OK
ENTERPRISE
Time taken: 0.075 seconds, Fetched: 1 row(s)
【讨论】:
谢谢你!!!修剪/拆分效果更好,并帮助消除了我在使用空格时遇到的一些问题。 @buddykumar 如果您对我的回答感到满意,请接受回答【参考方案2】:HIVE 支持 INSTR,它返回与 CHARINDEX 基本相同的函数,但输入字段和测试值在函数中是相反的,所以我会尝试
SELECT SUBSTR('ENTERPRISE > DEMO',1,INSTR('ENTERPRISE > DEMO','>') -2)
【讨论】:
【参考方案3】:你可以使用
1) substring
和 instr
的组合
trim(substring(val,1,instr(val,'>')-1))
2)regexp_extract
trim(regexp_extract(val,'(^.*)>',1))
【讨论】:
以上是关于如何在 HIVE 中提取字符串的一部分?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过使用 Hive Script SQL 中的分隔符来提取字符串的一部分?