Hive中提取字符串数字并转换为数组的实现咨询
解决Hive字符串列提取数字并转换为数组的问题
当然可以实现!你之前用regex_replace去除字母的思路没问题,但要得到数组类型的结果,更高效可靠的方式是用Hive的regexp_extract_all函数,它能直接提取所有匹配的数字序列并返回数组,避免了split可能带来的空元素问题。
直接提取数字数组(字符串类型)
假设你的表名为your_table,目标字符串列是col_a,可以用下面的SQL直接得到数字数组:
SELECT col_a, regexp_extract_all(col_a, '\\d+', 0) AS col_b FROM your_table;
\\d+是正则表达式,匹配一个或多个连续数字;regexp_extract_all的第三个参数0表示提取整个匹配的子串,最终返回的col_b就是字符串类型的数组,比如输入ddjj3332 jjn32212 334334,输出就是["3332","32212","334334"](Hive中数组的显示格式)。
转换为整数类型数组
如果需要把数组元素转为整数类型,可以搭配transform函数:
SELECT col_a, transform(regexp_extract_all(col_a, '\\d+', 0), x -> cast(x AS INT)) AS col_b FROM your_table;
这样col_b就会变成整数数组,比如[3332,32212,334334]。
为什么不推荐regex_replace + split?
你之前尝试的regex_replace去除字母后,得到的是空格分隔的数字字符串,再用split转数组的写法类似:
SELECT col_a, split(regexp_replace(col_a, '[a-zA-Z]', ''), '\\s+') AS col_b FROM your_table;
但这种方法有缺陷:如果原字符串开头/结尾有多余空格,或者字母去除后出现连续空格,split会生成空元素(比如输入 ddjj3332 jjn32212 ,会得到["","3332","32212",""]),而regexp_extract_all只会提取真正的数字序列,不会产生无效元素。
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

