Hive SQL 查询中 Regexp_replace 的奇怪行为

Posted

技术标签:

【中文标题】Hive SQL 查询中 Regexp_replace 的奇怪行为【英文标题】:Strange behaviour of Regexp_replace in a Hive SQL query 【发布时间】:2020-01-13 06:12:52 【问题描述】:

我有一些输入信息,我试图从输入中删除部分 .0,其中 ID 字符串以 .0 结尾。

select student_id, regexp_replace(student_id, '.0','') from school_result.credit_records where student_id like '%.0';

输入:

01-0230984.03
12345098.0
34567.0

预期输出:

01-0230984.03 
12345098
34567

但我得到的结果如下:它删除了任何带有0 的字符,而不是只删除以.0 结尾的字符

0129843
123498
34567

我做错了什么?有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

Dot in regexp 有特殊含义(表示任何字符)。如果您从字面上需要点 (.),则应使用双斜杠(在 Hive 中)对其进行屏蔽。还要添加行尾锚($):

with mydata as (
select stack(3,
'01-0230984.03',
'12345098.0',
'34567.0'
) as str
)

select regexp_replace(str,'\\.0$','') from mydata;

结果:

01-0230984.03
12345098
34567

正则表达式'\\.0$' 字面意思是点零(.0),行尾($)。

【讨论】:

只是想知道:如果我想在行首而不是行尾指定要删除的内容,那么我应该指定什么来代替$ ?? @LearneR 起始锚点是 ^ 像这样:'^0' - 表示开头为零

以上是关于Hive SQL 查询中 Regexp_replace 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

hive sql的语法帮助在哪

无法使用 pyspark 从 hive 表中查询复杂的 SQL 语句

如何查看hivesql里执行了哪些查询

带有多个子查询的 SQL 错误 10249 Hive

Spark SQL/Hive 查询永远需要加入

如何在 Hive/SQL 的 where/have 子句中使用 min()(以避免子查询)