web-dev-qa-db-fra.com

HiveQL - Comment trouver la valeur de la colonne est numérique ou n'utilise aucun UDF?

En gros, je voudrais return rows basé sur un column value.

Si la colonne contient non numeric valeurs, puis renvoie ces lignes à partir d'une table Hive.

Tout UDF est disponible dans Hive?

8
Shankar

Je crois que Hive prend en charge rlike (expressions régulières). Vous pouvez donc faire:

where col rlike '[^0-9]'

Cela recherche tout caractère non numérique. Vous pouvez développer cela si vos valeurs numériques peuvent avoir des virgules décimales ou des virgules.

14
Gordon Linoff

Utilisez cast(expr as <type>). Un null est retourné si la conversion échoue.

case when cast(col as double) is null then 'N' else 'Y' end as isNumber 

ou utilisez simplement l'expression booléenne dans WHERE: cast(col as double) is not null

Vous pouvez également créer une macro isNumber:

create temporary macro isNumber(s string)
       cast(s as double) is not null;

Et utilisez-le dans vos requêtes:

Hive> select isNumber('100.100'), isNumber('100'), isNumber('.0'), isNumber('abc');
OK
_c0     _c1     _c2     _c3
true    true    true    false

Si vous devez rechercher Integer, utilisez cast(s as Int)

Cette approche utilisant fonctionne correctement avec des nombres négatifs et fractionnaires.

8
leftjoin