我有一个 Pig 脚本——当前在本地模式下运行——它处理一个包含类别列表的巨大文件:
/root/level1/level2/level3
/root/level1/level2/level3/level4
...
我需要通过调用存储过程将这些中的每一个插入到现有数据库中。因为我是 Pig 新手,而且 UDF 界面有点令人生畏,所以我试图通过 PHP 脚本流式传输文件的内容来完成一些工作。
不过,我发现 PHP 脚本只能看到我通过它的类别行的一半。更准确地说,我看到了返回的记录ceil( pig_categories/2 )
。通过 PHP 脚本流式传输后,限制为 15 将产生 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 脚本从 using 更改fgets()
为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)
。接近了,但仍有一些差距要缩小。