如何在 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 函数。我怎样才能使用substrregexp_extract 来做这个?

【问题讨论】:

【参考方案1】:

除了已经提供了regexp_extractsubstr()+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) substringinstr 的组合

trim(substring(val,1,instr(val,'>')-1))

2)regexp_extract

trim(regexp_extract(val,'(^.*)>',1))

【讨论】:

以上是关于如何在 HIVE 中提取字符串的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式提取部分字符串的 Hive 查询

是否可以通过使用 Hive Script SQL 中的分隔符来提取字符串的一部分?

如何使用hive确定字符位置?例如,字符规则是aaaa_aaa想提取'_'后面的内容,怎么操作

hive中提取年月(与mysql语法存在差异)

问题在hive中插入数据创建小部分文件

在 Hive SQL 中提取具有特定模式的子字符串