كيف يمكنني تحميل ملف في قاعدة بيانات من داخل Yahoo Piglatin UDF؟

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

  •  01-10-2019
  •  | 
  •  

سؤال

لدي برنامج خنزير حيث أحاول حساب الحد الأدنى للمركز بين حقيبتين. من أجل العمل ، وجدت أنني بحاجة إلى تجميع الحقائب في مجموعة بيانات واحدة. العملية بأكملها تستغرق وقتا طويلا. أريد إما فتح أحد الأكياس من القرص داخل UDF ، أو أن أكون قادرًا على تمرير علاقة أخرى في UDF دون الحاجة إلى cogroup ......

شفرة:

# **** 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;

في الأساس مشكلتي هي أنه بالنسبة لكل براءة اختراع ، أحتاج إلى تمرير العلاقات الفرعية (WordCounts ، Kcenters). من أجل القيام بذلك ، أقوم بعمل صليب ، ثم مجموعة cogroup بواسطة PatentNumber من أجل الحصول على patentnumber المحدد ، {wordCounts} ، {kcenters}. إذا تمكنت من تحديد طريقة لتمرير علاقة أو فتح المراكز من داخل UDF ، فيمكنني فقط تجميع WordCounts بواسطة PatentNumber و Myudfs.Kmeans (WordCount) والتي نأمل أن تكون أسرع بكثير بدون Cross/Cogroup.

هذه عملية باهظة الثمن. حاليا هذا يستغرق حوالي 20 دقيقة ويبدو أنه يعالج وحدة المعالجة المركزية/ذاكرة الوصول العشوائي. كنت أفكر أنه قد يكون أكثر كفاءة بدون الصليب. لست متأكدًا من أنه سيكون أسرع ، لذلك أود التجربة.

على أي حال ، يبدو أن استدعاء وظائف التحميل من داخل الخنزير يحتاج إلى كائن pigcontext الذي لا أحصل عليه من evalfunc. ولاستخدام نظام ملفات Hadoop ، أحتاج إلى بعض الكائنات الأولية أيضًا ، والتي لا أرى كيفية الحصول عليها. لذا فإن سؤالي هو كيف يمكنني فتح ملف من نظام ملفات Hadoop من داخل UDF الخنزير؟ أنا أيضا تشغيل UDF عبر MAIN لتصحيح الأخطاء. لذلك أحتاج إلى التحميل من نظام الملفات العادي عندما يكون في وضع التصحيح.

ستكون هناك فكرة أفضل أخرى إذا كانت هناك طريقة لتمرير علاقة إلى UDF دون الحاجة إلى عبور/cogroup. سيكون هذا مثاليًا ، خاصةً إذا كانت العلاقة موجودة في الذاكرة .. أي أن تكون قادرًا على القيام myudfs.kmeans (WordCounts ، Kcenters) دون الحاجة إلى Cross/Cogroup مع Kcenters ...

لكن الفكرة الأساسية هي تداول IO لدورات RAM/CPU.

على أي حال ، ستكون أي مساعدة موضع تقدير كبير ، فالخنازير UDFs ليست موثقة جيدًا بما يتجاوز الأسلوب أبسط ، حتى في دليل UDF.

هل كانت مفيدة؟

المحلول

Cervo ، هناك udf في بنك الخنزير الذي يفعل أكثر أو أقل ما تريد ، يسمى lookupinfiles. تحقق من رمز المصدر ، يجب أن يكون واضحًا ومباشرًا التحويل إلى احتياجاتك.

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

يرجى إرسال القائمة بالبريد الإلكتروني إذا كان لديك أي مشكلات أخرى ، اقتراحات الوثائق ، إلخ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top