我正在尝试从包含数字和字符的列中提取数字。然而,它们是结构化的,因此我想知道我们是否可以提取数字。我想知道爆炸会不会起作用。
当前说明栏:
I need a help in setting up a campaign soon. Revenue: 1000
我尝试做的是为该数字创建一个名为revenue的新列。
我当前的命令是:
SELECT description, X.value
FROM task
lateral view
explode(description) X as value
答案 0 :(得分:2)
您可以尝试使用Split这样的功能
SELECT
description,
split (description, ':\\s')[1] as Revenue
FROM task
其中:\\s
是匹配冒号后跟空格的正则表达式模式。
-------- 编辑: --------
如果数据中有多个:
,那么您可以尝试(不确定它是否会起作用)以下(假设最后一次拆分始终包含数字)
SELECT
description,
split (description, ':\\s')[size(split (description, ':\\s')) - 1] as Revenue
FROM task
另外,尝试使用Revenue\\s:\\s
作为模式可能无法正常工作,因为额外的空格匹配尝试`收入:\ s'
---------------------------
或者,如果描述并不总是有冒号,您可以使用方法regexp_extract(string subject, string pattern, int index)
类似的东西:
SELECT
description,
regexp_extract(description, '.*?(\d+)$', 1) as Revenue
FROM task
正则表达式模式.*?(\\d+)$
将匹配描述末尾的多个数字(但仅限于它们在结尾处)
使用后一种选项,如果描述不一致,您应该能够找到合适的模式。
答案 1 :(得分:1)
您还可以使用以下内容删除任何非数字字符:
select regexp_replace(description, '[^0-9]', '') as Revenue from task
但这只适用于[description]字段中只有一个数字。如果格式可靠,使用更具体的RegEx可能更可取。