カテゴリのリストを含む巨大なファイルを処理する Pig スクリプト (現在ローカル モードで実行中) があります。
/root/level1/level2/level3
/root/level1/level2/level3/level4
...
ストアド プロシージャを呼び出して、これらをそれぞれ既存のデータベースに挿入する必要があります。私は Pig を初めて使用し、UDF インターフェイスは少し難しいので、PHP スクリプトを介してファイルのコンテンツをストリーミングすることで何かを成し遂げようとしています。
ただし、PHP スクリプトは、通過しているカテゴリ行の半分しか認識していないことがわかりました。より正確には、 に対して返されたレコードが表示されceil( pig_categories/2 )
ます。15 の制限では、PHP スクリプトを介したストリーミング後に 8 つのエントリが生成されます。最後のエントリは空になります。
-- Pig script snippet
ordered = ORDER mappable_categories BY category;
limited = LIMIT ordered 20;
categories = FOREACH limited GENERATE category;
DUMP categories; -- Displays all 20 categories
streamed = STREAM limited THROUGH `php -nF categorize.php`;
DUMP streamed; -- Displays 10 categories
# categorize.php
$category = fgets( STDIN );
echo $category;
私が欠けているものについての考え。しばらくの間、Pig のリファレンス マニュアルを調べましたが、PHP スクリプトによるストリーミングに関する情報はあまりないようです。また、IRC で #hadoop チャネルを試しましたが、役に立ちませんでした。どんなガイダンスでも大歓迎です。
ありがとう。
アップデート
これが EOL 関連であることが明らかになりつつあります。PHP スクリプトを usingfgets()
からに変更するstream_get_line()
と、10 個のアイテムが返されますが、最初にあるはずのレコードがスキップされ、末尾に空のレコードが表示されます。
(Arts/Animation)
(Arts/Animation/Anime)
(Arts/Animation/Anime/Characters)
(Arts/Animation/Anime/Clubs_and_Organizations)
(Arts/Animation/Anime/Collectibles)
(Arts/Animation/Anime/Collectibles/Cels)
(Arts/Animation/Anime/Collectibles/Models_and_Figures)
(Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures)
(Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures/Gundam)
()
その結果セットには、 の最初の項目があるはずです(Arts)
。近づいていますが、まだ埋めなければならないギャップがあります。