1

我正在通过 Redash 查询 Hive 表。我有一个类似于以下的查询:

SELECT 
    CAST(id AS INT) as id,
    COUNT(sales) AS num_sales
FROM 
    sales_table
WHERE 
    id RLIKE '\d*'
GROUP BY 
    id

我试图仅选择作为数字字符串的 ID,因此该WHERE子句。这给了我这个错误:

Error running query: line 42:20: mismatched input 'RLIKE'. Expecting: '%', '*', '+', '-', '.', '/', 'AT', '[', '||', <expression>
4

3 回答 3

0

你可以试试:

WHERE id RLIKE '^[0-9]+$'

请注意,上面的表达式确保它id仅由数字组成(并且非空)。您最初的正则表达式正在检查是否id包含0 到 n位(这就是*量词的含义):这是一种允许的方式,因为它基本上允许任何不为空的内容。

于 2020-03-17T14:45:01.693 回答
0

1)

Hive 正则表达式需要双重转义

此外,对于完全匹配,您应该使用锚定,因此 -

id RLIKE '^\\d+$'

如果空字符串也是一个选项,那么 -

id RLIKE '^\\d*$'

2)
您可以采取相反的方法并搜索不包含非数字的字符串 -

id  NOT RLIKE '\\D'

3)
在 Hive 中,错误转换导致 null(而不是异常),因此您可以使用 -

cast(id as int) is not null

或者

int(id) is not null
于 2020-03-17T15:39:45.737 回答
-1

在 Hive 中,代码应使用REGEXP或进行编译RLIKE。但是,您的正则表达式不符合您的要求。你要:

WHERE id RLIKE '^[0-9]*$'

也就是说,所有字符都是数字,而不是只包含一个数字。好吧,实际上,您的版本将匹配任何字符串,因为数字是可选的。

于 2020-03-17T14:44:39.123 回答