RLIKE выражение, дающее ошибку «несоответствующий ввод» - PullRequest
1 голос
/ 17 марта 2020

Я запрашиваю таблицу Hive через Reda sh. У меня есть запрос, подобный следующему:

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

Я пытаюсь выбрать только идентификаторы, которые представляют собой строку цифр, отсюда и предложение WHERE. Это дает мне эту ошибку:

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

Ответы [ 3 ]

0 голосов
/ 17 марта 2020

Вы можете попробовать:

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

Обратите внимание, что приведенное выше выражение гарантирует, что id состоит только из цифр (и не является пустым). Вы изначально проверяли регулярное выражение, содержит ли id от 0 до n цифр (это то, что означает квантификатор *): это путь к разрешению, поскольку он в основном разрешает все, что не равно нулю.

0 голосов
/ 17 марта 2020

1)

Регулярное выражение Hive требует двойного экранирования

также, для полного соответствия вы должны использовать привязку, поэтому -

id RLIKE '^\\d+$'

, если также доступна пустая строка затем -

id RLIKE '^\\d*$'

2)
Вы можете использовать противоположный подход и искать строки, не содержащие не-* * * * * * * * * * * * * *
В Hive ложное приведение приводит к нулю (и не является исключением), поэтому вы можете использовать -

cast(id as int) is not null

или

int(id) is not null
0 голосов
/ 17 марта 2020

В Hive код должен компилироваться либо с REGEXP, либо с RLIKE. Тем не менее, ваше регулярное выражение не делает то, что вы хотите. Вы хотите:

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

То есть все символы являются цифрами, а не просто содержат один ди git. Ну, на самом деле ваша версия будет соответствовать любой строке, потому что di git является необязательным.

...