如何在配置单元中实现 regexp_substr?
how to implement regexp_substr in hive?
所以我有一个 oracle 查询:
SELECT REGEXP_SUBSTR('BOND~CRR~CD~DAKAR_2299913320','[^~]+',1,3) FROM DUAL
从那个查询结果应该是这样的:CD
现在,我的问题是如何在配置单元中实现该查询,因为据我所知,配置单元没有 REGEXP_SUBSTR 语法,到目前为止我已经尝试过的是:
select regexp_extract('BOND~CRR~CD~DAKAR_2299913320','[^~]+',0)
但结果是:BOND
当我将查询更改为:
select regexp_extract('BOND~CRR~CD~DAKAR_2299913320','[^~]+',2)
它给出了语义异常:错误的参数“2”
那么有什么方法可以在配置单元中实现该 oracle 查询吗?
您可以使用 SPLIT 函数代替 REGEXP
select split('BOND~CRR~CD~DAKAR_2299913320','[\~]')[2]
更多详情请参阅下文link
如此处所述:https://cwiki.apache.org/confluence/display/hive/languagemanual+udf最后一个参数是捕获组的索引。
您遇到了 wrong arguments '2'
异常,因为在您的示例中您没有任何捕获组(一般 0 除外)
REGEXP_SUBSTR 按预期工作,您只需修复一件事就是正则表达式。
例如:
select regexp_extract('BOND~CRR~CD~DAKAR_2299913320','^[^~]*~[^~]*~([^~]*)~.*',1);
会给你想要的结果。
Hive 使用 java 正则表达式的实现,因此最好的知识来源是:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
所以我有一个 oracle 查询:
SELECT REGEXP_SUBSTR('BOND~CRR~CD~DAKAR_2299913320','[^~]+',1,3) FROM DUAL
从那个查询结果应该是这样的:CD
现在,我的问题是如何在配置单元中实现该查询,因为据我所知,配置单元没有 REGEXP_SUBSTR 语法,到目前为止我已经尝试过的是:
select regexp_extract('BOND~CRR~CD~DAKAR_2299913320','[^~]+',0)
但结果是:BOND
当我将查询更改为:
select regexp_extract('BOND~CRR~CD~DAKAR_2299913320','[^~]+',2)
它给出了语义异常:错误的参数“2”
那么有什么方法可以在配置单元中实现该 oracle 查询吗?
您可以使用 SPLIT 函数代替 REGEXP
select split('BOND~CRR~CD~DAKAR_2299913320','[\~]')[2]
更多详情请参阅下文link
如此处所述:https://cwiki.apache.org/confluence/display/hive/languagemanual+udf最后一个参数是捕获组的索引。
您遇到了 wrong arguments '2'
异常,因为在您的示例中您没有任何捕获组(一般 0 除外)
REGEXP_SUBSTR 按预期工作,您只需修复一件事就是正则表达式。 例如:
select regexp_extract('BOND~CRR~CD~DAKAR_2299913320','^[^~]*~[^~]*~([^~]*)~.*',1);
会给你想要的结果。
Hive 使用 java 正则表达式的实现,因此最好的知识来源是:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html