Comment puis-je charger un fichier dans un à partir d'un terrain Base de données Yahoo PigLatin UDF?

StackOverflow https://stackoverflow.com/questions/2721902

  •  01-10-2019
  •  | 
  •  

Question

J'ai un programme de porc où je suis en train de calculer le centre minimum entre deux sacs. Pour que cela fonctionne, j'ai trouvé que je dois COGROUP les sacs dans un seul jeu de données. L'ensemble de l'opération prend beaucoup de temps. Je veux soit ouvrir l'un des sacs à partir du disque au sein de l'UDF, ou d'être en mesure de passer une autre relation à l'UDF sans avoir besoin de COGROUP ......

Code:

# **** Load files for iteration ****
register myudfs.jar;
wordcounts = LOAD 'input/wordcounts.txt' USING PigStorage('\t') AS (PatentNumber:chararray, word:chararray, frequency:double);
centerassignments = load 'input/centerassignments/part-*' USING PigStorage('\t') AS (PatentNumber: chararray, oldCenter: chararray, newCenter: chararray);
kcenters = LOAD 'input/kcenters/part-*' USING PigStorage('\t') AS (CenterID:chararray, word:chararray, frequency:double);
kcentersa1 = CROSS centerassignments, kcenters;
kcentersa = FOREACH kcentersa1 GENERATE centerassignments::PatentNumber as PatentNumber, kcenters::CenterID as CenterID, kcenters::word as word, kcenters::frequency as frequency;

#***** Assign to nearest k-mean *******
assignpre1 = COGROUP wordcounts by PatentNumber, kcentersa by PatentNumber;
assignwork2 = FOREACH assignpre1 GENERATE group as PatentNumber, myudfs.kmeans(wordcounts, kcentersa) as CenterID;

essentiellement mon problème est que, pour chaque brevet que je dois passer les relations sous (wordcounts, kcenters). Pour ce faire, je fais une croix, puis un COGROUP par PatentNumber afin d'obtenir le PatentNumber set, {wordcounts}, {} kcenters. Si je pouvais trouver un moyen de passer une relation ou d'ouvrir les centres au sein de l'UDF, alors je pouvais GROUPE wordcounts par PatentNumber et myudfs.kmeans exécuter (Wordcount) qui est beaucoup plus rapide, espérons sans CROSS / COGROUP.

Ceci est une opération coûteuse. À l'heure actuelle cela prend environ 20 minutes et semble virer de bord la CPU / RAM. Je pensais que ce serait peut-être plus efficace sans la croix. Je ne suis pas sûr que ce sera plus rapide, donc je voudrais expérimenter.

En tout cas, il semble appeler les fonctions de chargement à partir de porc a besoin d'un objet PigContext que je ne reçois pas d'un evalfunc. Et d'utiliser le système de fichiers Hadoop, j'ai besoin des objets initiaux et que je ne vois pas comment. Donc, ma question est de savoir comment puis-je ouvrir un fichier à partir du système de fichiers Hadoop à partir d'un PIG UDF? Je dirige également l'UDF via principale pour le débogage. Je dois donc la charge du système de fichiers normale en mode débogage.

Une autre meilleure idée serait s'il y avait un moyen de passer une relation dans une UDF sans avoir besoin de CROSS / COGROUP. Ce serait idéal, surtout si la relation réside dans la mémoire .. à savoir pouvoir faire myudfs.kmeans (wordcounts, kcenters) sans avoir besoin du CROSS / COGROUP avec kcenters ...

Mais l'idée de base est de commerce IO pour les cycles RAM / CPU.

De toute façon toute aide sera très appréciée, les UDFs PIG ne sont pas super bien documentés au-delà des plus simples, même dans le manuel UDF.

Était-ce utile?

La solution

Cervo, Il y a une UDF dans la Tirelire qui fait plus ou moins ce que vous voulez, appelé LookupInFiles. Consultez le code source, il devrait être assez facile de se convertir à vos besoins.

http://svn.apache.org/viewvc/hadoop/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation /string/LookupInFiles.java

S'il vous plaît e-mail la liste si vous avez d'autres questions, suggestions de documentation, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top