1
votes

Expression RLIKE donnant une erreur "entrée non concordante"

J'interroge une table Hive via Redash. J'ai une requête similaire à la suivante:

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

J'essaie de sélectionner uniquement les ID qui sont une chaîne de chiffres, d'où la clause WHERE . Cela me donne cette erreur:

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


0 commentaires

3 Réponses :


-1
votes

Dans Hive, le code doit être compilé avec REGEXP ou RLIKE . Cependant, votre expression régulière ne fait pas ce que vous voulez. Vous voulez:

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

Autrement dit, tous les caractères sont des chiffres, plutôt que de contenir un seul chiffre. Eh bien, en fait, votre version correspondrait à n’importe quelle chaîne, car le chiffre est facultatif.


1 commentaires

Hive regex nécessite un double échappement



0
votes

Vous pouvez essayer:

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

Notez que l'expression ci-dessus garantit que id est composé uniquement de chiffres (et non vide). Votre expression régulière d'origine vérifiait si id contenait 0 à n chiffres (c'est ce que signifie le quantificateur * ): c'est une façon de permissif, car il autoriserait essentiellement tout ce qui n'est pas nul.


0 commentaires

0
votes

1)

Hive regex nécessite un double échappement

également, pour une correspondance complète, vous devez utiliser l'ancrage, donc -

int(id) is not null

si une chaîne vide est également une option alors -

cast(id as int) is not null

2)
Vous pouvez adopter l'approche opposée et rechercher des chaînes qui ne contiennent pas de chiffre -

id  NOT RLIKE '\\D'

3)
Dans Hive, un faux casting entraîne null (et pas une exception), vous pouvez donc utiliser -

id RLIKE '^\\d*$'

ou

id RLIKE '^\\d+$'

p >


0 commentaires