Pigに次の入力があると仮定します。
some
そして、私はそれを次のように変換したいと思います。
s
so
som
some
私は(まだ)ピッグラテン語のchararrayを反復処理する方法を見つけていません。TOKENIZE関数を見つけましたが、それは単語の境界で分割されます。それで、「pig latin」はこれを行うことができますか、それともこれを行うためにJavaクラスを必要とするものですか?
Pigに次の入力があると仮定します。
some
そして、私はそれを次のように変換したいと思います。
s
so
som
some
私は(まだ)ピッグラテン語のchararrayを反復処理する方法を見つけていません。TOKENIZE関数を見つけましたが、それは単語の境界で分割されます。それで、「pig latin」はこれを行うことができますか、それともこれを行うためにJavaクラスを必要とするものですか?
カスタムUDFを記述せずに、pigストリーミングとpythonを使用してこれを行う方法は次のとおりです。
データが1列の単語であるとします。物事を処理するためのPythonスクリプト(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')
次に、pigスクリプトで、上記のスクリプトでストリーミングを使用しており、必要に応じてスクリプトを出荷することをpigに伝えます。
-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship('wordSeq.py');
W0 = LOAD 'words';
W = STREAM W0 THROUGH CMD as (word: chararray);
Niels、TOKENIZEは区切り文字の引数を取るので、各文字を分割することができます。ただし、重複するトークンを生成する方法は考えられません。
ただし、PigでUDFを作成するのは非常に簡単です。EvalFuncと呼ばれる単純なインターフェースを実装するだけです(詳細はこちら:http ://wiki.apache.org/pig/UDFManual )。Pigは、ユーザーがほとんどすべてを処理するために独自の関数を作成するという考えに基づいて構築されたため、独自のUDFを作成することは一般的で自然なことです。
さらに簡単なオプションは、効率的ではありませんが、Pigストリーミングを使用してデータをスクリプトに渡すことです(1回限りのジョブにJavaクラスを実装するよりも高速なPerlまたはPythonスクリプトを作成する方が速いと思います)。ここにこの例があります:http ://www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/-これは、既存のライブラリの使用法を示しています。 Perlスクリプト、UDF、さらにはオンザフライのawkスクリプト。
貯金箱ライブラリを使用します。
このように使用します:
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);