[JAVA] Pour le traitement d'agrégation qui ne peut pas être effectué avec la fonction prédéfinie Hive, essayez d'abord la fonction Reflect.

Aperçu

Lors de l'agrégation avec Hadoop / Hive, le processus d'agrégation qui ne peut pas être réalisé par la fonction prédéfinie sera géré en créant un UDF personnalisé, en produisant le résultat, puis en le traitant avec un autre programme. Cependant, il est facile de le gérer dans la requête Hive car il est difficile d'écrire un autre code et il est difficile à gérer.

Si le travail que vous souhaitez faire peut être géré par une classe Java existante, ** la fonction Reflect de Hive peut le faire sans écrire votre propre wrapper **.

environnement

Hive 0.9 ou supérieur (l'environnement de vérification est 2.1.0)

Reflect UDF https://cwiki.apache.org/confluence/display/Hive/ReflectUDF Instanciez et appelez une méthode d'un objet à l'aide de la réflexion Java. Vous pouvez également appeler des fonctions statiques.

Cette méthode doit renvoyer un type primitif ou un type que Hive sait sérialiser.

De base


reflect(class, method[, arg1[, arg2..]])

Exemple 1. Chaîne de caractères / traitement numérique

L'exemple est une fonction qui peut être réalisée avec une fonction prédéfinie, Vous pouvez appeler librement le traitement implémenté dans la classe java, afin que vous puissiez atteindre l'endroit qui démange.


SELECT reflect("java.lang.String", "valueOf", 1),
       reflect("java.lang.String", "isEmpty"),
       reflect("java.lang.Math", "max", 2, 3),
       reflect("java.lang.Math", "min", 2, 3),
       reflect("java.lang.Math", "round", 2.5),
       reflect("java.lang.Math", "exp", 1.0),
       reflect("java.lang.Math", "floor", 1.9),
       reflect("java.lang.Math", "abs", -10)
FROM src LIMIT 1;
 
 
1       true    3       2       3       2.718281828459045       1.0     10

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Math.html

Cas 2. Encodage / décodage d'URL

L'URL de l'écran des résultats de la recherche comprend la chaîne de caractères d'entrée gratuite de l'utilisateur (chaîne de caractères de recherche), mais comme la chaîne de caractères de recherche est généralement enregistrée dans le journal dans un état encodé en URL, elle est décodée en une chaîne de caractères qui peut être lue par l'analyste. Le traitement à faire est pratique. En combinant ce processus, ** la génération du classement des chaînes de caractères de recherche, etc. à partir du journal d'accès peut être complétée avec une seule requête **

Étant donné que le contenu de traitement est simple, il est préférable d'utiliser la fonction de réflexion.


SELECT 
  encoded_url,
  reflect("org.apache.commons.codec.net.URLCodec", "decode", encoded_url, "UTF-8"), 
  reflect("java.net.URLDecoder", "decode", encoded_url, "UTF-8") 
FROM src LIMIT 1;

%E3%83%86%E3%82%B9%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%Message de test du message de test B8

https://docs.oracle.com/javase/jp/8/docs/api/java/net/URLDecoder.html https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/net/URLCodec.html

Cas 3. Génération de valeur de hachage

De nombreuses fonctions de hachage sont déjà disponibles dans les fonctions intégrées depuis Hive 1.3, Même dans les versions antérieures, vous pouvez appeler et générer librement des formats qui ne figurent pas dans les fonctions intégrées.

SELECT
  md5('hoge'), 
  sha2('hoge',256), 
  sha2('hoge',384), 
  sha2('hoge',512),
  reflect('org.apache.commons.codec.digest.DigestUtils', 'md5Hex', 'hoge'), 
  reflect('org.apache.commons.codec.digest.DigestUtils', 'sha256Hex', 'hoge'), 
  reflect('org.apache.commons.codec.digest.DigestUtils', 'sha384Hex', 'hoge'), 
  reflect('org.apache.commons.codec.digest.DigestUtils', 'sha512Hex', 'hoge')
from src LIMIT 1;

ea703e7aa1efda0064eaa507d9e8ab7e 
ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825  cc2aa04a6cb251b8d9dfbacc60b806587456d3fc356dc832116b9ba188713e6adf5f995b750d86b0883b24d07a37c720 dbb50237ad3fa5b818b8eeca9ca25a047e0f29517db2b25f4a8db5f717ff90bf0b7e94ef4f5c4e313dfb06e48fbd9a2e40795906a75c470cdb619cf9c2d4f6d9 

ea703e7aa1efda0064eaa507d9e8ab7e 
ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825 cc2aa04a6cb251b8d9dfbacc60b806587456d3fc356dc832116b9ba188713e6adf5f995b750d86b0883b24d07a37c720 dbb50237ad3fa5b818b8eeca9ca25a047e0f29517db2b25f4a8db5f717ff90bf0b7e94ef4f5c4e313dfb06e48fbd9a2e40795906a75c470cdb619cf9c2d4f6d9 

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html

Résumé

La dernière version a beaucoup de fonctions intégrées, donc je ne ressens aucune pénurie, https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

Les parties qui sont hors de portée des zones qui démangent telles que le codage / décodage d'URL continueront à apparaître à l'avenir. Le traitement à usage général / primitif qui ne nécessite pas d'UDF est quelque chose que vous souhaitez traiter facilement.

Si vous utilisez la fonction Reflect, vous pouvez profiter de sa commodité et de sa commodité.

référence

Recommended Posts

Pour le traitement d'agrégation qui ne peut pas être effectué avec la fonction prédéfinie Hive, essayez d'abord la fonction Reflect.
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment