générer des identifiants uniques dans la ruche
J'ai essayé de générer des identifiants uniques pour chaque ligne d'une table (30 m+ lignes).
- à l'aide des numéros séquentiels évidemment pas ne fonctionne pas en raison de la nature parallèle de Hadoop.
- le construit dans les UDFs rand() et dièse(rand(),unixtime()) semblent générer des collisions.
Il y a un moyen simple de générer des id de ligne, et je me demandais de quelqu'un a une solution.
- ma prochaine étape, c'est la création d'un Java carte de réduire l'emploi de générer une véritable chaîne de hash avec une sécurité aléatoire + IP de l'hôte + heure actuelle comme une graine. mais je suppose que je vais demander ici avant de le faire 😉
- Avez-vous envisagé de Uuid?
Vous devez vous connecter pour publier un commentaire.
Utiliser le reflet de l'UDF, pour générer des Uuid.
Ne sais pas si c'est pratique, mais voilà...
Considérer le natif de MapReduce analogique: en supposant que votre jeu de données d'entrée de texte, la saisie de Mapper la touche (et donc de l'ID unique) serait, pour chaque ligne, le nom du fichier ainsi que son décalage d'octet.
Lorsque vous chargez les données dans la Ruche, si vous pouvez créer un extra "colonne" qui a cette info, vous obtenez votre rowID pour gratuit. Il est sémantiquement vide de sens, mais c'est aussi l'approche que vous mentionnez ci-dessus.
L'élaboration de la réponse par jtravaglini,
il y a 2 construit dans la Ruche les colonnes virtuelles depuis 0.8.0 qui peut être utilisé pour générer un identifiant unique:
Utiliser comme ceci:
Ou vous permet d'anonymiser qu'avec md5 ou similaire, voici un lien vers md5 UDF:
https://gist.github.com/dataminelab/1050002
(note de la fonction nom de la classe est initcap 'Md5')
INPUT__FILE__NAME
BLOCK__OFFSET__INSIDE__FILE
réfléchir("java.util.UUID", "randomUUID")
Je ne pouvais pas voter jusqu'à l'autre. J'avais besoin d'une pure version binaire, alors j'ai utilisé ceci:
unhex(regexp_replace(reflect (java.util.UUID','randomUUID'), '-', "))
Selon la nature de vos travaux et de la fréquence à laquelle vous prévoyez d'exécuter, en utilisant des numéros séquentiels peut effectivement être une alternative raisonnable. Vous pouvez mettre en œuvre un
rank()
de l'UDF, comme décrit dans cette autre DONC, la question.Écrire un personnalisé du Mappeur qui maintient un compteur pour chaque Carte tâche et crée comme ID de ligne pour une ligne de la concaténation de JobID() (obtenue à partir de la M. API) + valeur actuelle du compteur. Avant que la ligne suivante est examiné, incrémenter le compteur.
Si vous voulez travailler avec plusieurs cartographes et avec le grand jeu de données, essayez d'utiliser ce UDF: https://github.com/manojkumarvohra/hive-hilo
Il fait usage de zookeeper en tant que référentiel central pour maintenir l'état de la séquence et unique généré de l'incrémentation des valeurs numériques
Utiliser la fonction ROW_NUMBER pour générer de plus en plus monotone integer id.
Voir https://community.hortonworks.com/questions/58405/how-to-get-the-row-number-for-particular-values-fr.html