入力をPIGのサブストリングに分割する(Hadoop)
-
05-07-2019 - |
質問
Pigに次の入力があると仮定します。
some
そしてそれを次のように変換したいと思います。
s
so
som
some
私は(まだ)豚のラテン語でchararrayを反復処理する方法を見つけていません。 TOKENIZE関数を見つけましたが、それは単語の境界で分かれています。 したがって、「豚のラテン」もできます。これを行うか、これを行うにはJavaクラスが必要なものですか?
解決
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スクリプトも。
他のヒント
カスタムUDFを記述せずに、豚のストリーミングと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);
piggybankライブラリを使用します。
次のように使用します:
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)<*>, 0, 10);