سؤال

وافترض لدي الإدخال التالية في الخنزير:

some

وأود أن تحويل ذلك إلى:

s
so
som
some

وأنا لم (حتى الآن) وجدت وسيلة لتكرار أكثر من chararray في خنزير اللاتينية. لقد وجدت وظيفة TOKENIZE لكن الذي يقسم على boundries كلمة. بحيث يمكن لل"خنزير اللاتينية" القيام بذلك أم أن هذا الأمر الذي يتطلب فئة Java للقيام بذلك؟

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

المحلول

ونيلز، TOKENIZE يأخذ حجة محدد، حتى تتمكن من جعلها تقسيم كل حرف. ومع ذلك لا أستطيع أن أفكر في طريقة لجعلها تنتج <م> متداخلة الرموز.

وانها واضحة جدا لكتابة UDF في الخنزير، على الرغم من. كنت مجرد تطبيق واجهة بسيطة تسمى EvalFunc (تفاصيل هنا: http://wiki.apache.org/pig/UDFManual ). بنيت خنزير حول فكرة مستخدمين كتابة وظائفهم الخاصة لمعالجة معظم أي شيء، والكتابة وبالتالي UDF الخاصة بك أمر شائع وطبيعي للقيام به.

وخيار أسهل، وإن لم يكن بنفس كفاءه، هو استخدام الخنزير يتدفقون لتمرير البيانات من خلال برنامج نصي (أجد الجلد لأعلى من بيرل أو بيثون النصي سريع لتكون أسرع من تنفيذ الطبقات جافا لعمل لمرة واحدة). وهناك مثال على ذلك هنا: HTTP: //www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - أنه يوضح استخدام موجودة من قبل مكتبة، مخطوطة برل، وهو UDF، وحتى النصي AWK على ذبابة.

نصائح أخرى

وهنا هو كيف يمكن أن تفعل ذلك مع تدفق الخنزير والثعبان دون كتابة UDFS مخصص:

لنفترض البيانات الخاصة بك هو مجرد 1 عمود من الكلمات. السيناريو الثعبان (يتيح نسميها wordSeq.py) لمعالجة الأمور ستكون كما يلي:

#!/usr/bin/python
### wordSeq.py ### [don't forget to chmod u+x wordSeq.py !]
import sys
for word in sys.stdin:
  word = word.rstrip()
  sys.stdout.write('\n'.join([word[:i+1] for i in xrange(len(word))]) + '\n')

وبعد ذلك، في البرنامج النصي خنزير الخاص، لك أن تقول خنزير كنت تستخدم الجري مع البرنامج النصي أعلاه وأنك تريد أن تشحن السيناريو الخاص بك عند الضرورة:

-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship('wordSeq.py');
W0 = LOAD 'words';
W = STREAM W0 THROUGH CMD as (word: chararray);

استخدم المكتبة الحصالة.

<وأ href = "http://hadoop.apache.org/pig/docs/r0.7.0/api/org/apache/pig/piggybank/evaluation/string/SUBSTRING.html" يختلط = "نوفولو noreferrer" > http://hadoop.apache.org/pig/docs/r0.7.0/api/org/apache/pig/piggybank/evaluation/string/SUBSTRING.html

استخدم مثل هذا:

REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top