Hive regexp_extract |或 误区

select url,regexp_extract(k.url,'(.*?)(/$|[^/]$)',1)url_new from table_2022 k

错误写法:
select url,regexp_extract(k.url,'((.*?)/$)|((.*?)[^/]$)',1)url_new from table_2022 k

注意:

hive regexp_extract(string subject,string pattern,int index)方法中,index 是以小括号为标准的,如果是上面错误示范中的写法,返回的永远是|前面的第一个小括号中的匹配内容。切记!

### Hive 中 `regexp_extract` 函数不匹配数字的解决方案 当遇到 `regexp_extract` 函数无法正确提取数字的情况时,可以考虑以下几个方面来解决问题。 #### 使用合适的正则表达式模式 对于数字的匹配,在正则表达式中应使用 `\d` 者 `[0-9]` 来表示一位多位于数字。如果目标是从字符串中抽取连续的一串数字,则可以在上述基础上加上量词 `{n}` 表示重复次数,者使用 `+` 号代表一次多次出现[^1]。 例如,要从价格描述 "商品售价为 12345 元" 提取出金额部分: ```sql SELECT regexp_extract('商品售价为 12345 元', '\\d+', 0); ``` 这里注意两点: - 需要在Hive SQL里对反斜杠做转义处理,即实际使用的应该是双反斜杠 `\\d` 而不是单个反斜杠; - 如果希望获取整个匹配的结果而非特定组内的内容,那么第三个参数应该设置为 `0`;否则可以根据需求调整此值指向所需捕获群组的位置[^2]。 #### 处理可能存在的空白字符其他干扰因素 有时数字前后可能存在空格者其他不可见字符影响到正常匹配。此时可以通过添加可选的空白符匹配项来增强健壮性,如下面的例子所示: ```sql SELECT regexp_extract(' 商品售价为 12345 元 ', '[ ]*([0-9]+)[ ]*', 1); ``` 这段SQL语句不仅能够成功抓取中间夹杂着多个空格的纯数字序列,而且通过圆括号内定义了一个子表达式用于最终输出结果——也就是我们真正关心的那个数值本身[^4]。 #### 应用实例展示 假设有一个表名为 `sales_data` 的数据集,其中包含一列记录了不同产品的销售情况说明文字字段 `description` 和另一列表达具体销量数量但混入了一些非数字信息的 `quantity_info` 字段。现在想要创建一个新的视图只保留有效的产品名称及其对应的精确售出件数。 ```sql CREATE VIEW clean_sales AS SELECT product_name, CAST(regexp_extract(quantity_info, '.*?([0-9]+).*?', 1) AS INT) as quantity_sold FROM sales_data; ``` 在这个例子中,`. * ?` 组合用来尽可能少地贪婪匹配任意字符直到找到第一个符合条件的数字为止,并将其作为新的 `quantity_sold` 列存入新建立好的视图当中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值