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
3 Réponses :
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.
Hive regex nécessite un double échappement
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.
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 >