Yahoo Piglatin UDF内からファイルをデータバッグにロードするにはどうすればよいですか?
-
01-10-2019 - |
質問
私は2つのバッグ間で最小センターを計算しようとしている豚プログラムを持っています。それが機能するためには、バッグを単一のデータセットに接続する必要があることがわかりました。操作全体に長い時間がかかります。 UDF内のディスクからバッグの1つを開くか、cogroupを必要とせずに別の関係をUDFに渡すことができます......
コード:
# **** 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)に合格する必要があるということです。これを行うために、私はクロスを行い、次にパテントナンバーによるクログープを行い、{wordcounts}、{kcenters}を取得します。関係を通過したり、UDF内からセンターを開いたりする方法を把握できれば、PatentNumberでWordCountsをグループ化して、Myudfs.kmeans(WordCount)を実行することができます。
これは高価な操作です。現在、これには約20分かかり、CPU/RAMをタックするように見えます。私はそれが十字架なしでより効率的かもしれないと思っていました。それがより速くなるかどうかはわかりませんので、実験したいです。
とにかく、豚の内側から荷重機能を呼び出す必要があるように見えますが、evalfuncから得られないPigcontextオブジェクトが必要です。また、Hadoopファイルシステムを使用するには、最初のオブジェクトも必要です。それで、私の質問は、豚のUDF内からHadoopファイルシステムからファイルを開くにはどうすればよいですか?また、デバッグのためにメイン経由でUDFを実行します。したがって、デバッグモードの場合、通常のファイルシステムからロードする必要があります。
もう1つのより良いアイデアは、交差/cogroupを必要とせずに関係をUDFに渡す方法がある場合です。これは、特に関係がメモリに存在する場合に理想的です。
しかし、基本的なアイデアは、IOをRAM/CPUサイクルと交換することです。
とにかく、どんな助けも大いに感謝されます、豚のUDFは、UDFマニュアルであっても、最も単純なものを超えて非常に十分に文書化されていません。
解決
Cervo、Piggybankには、lookupinfilesと呼ばれる多かれ少なかれあなたが望むものを行うUDFがあります。ソースコードを確認してください。ニーズに変換するのは非常に簡単です。
他の問題、ドキュメントの提案などがある場合は、リストにメールを送信してください。