事实证明,Pig确实正确地将 EOF 发送到外部命令,因此您可以选择通过外部脚本流式传输所有内容。如果它不起作用,那么您可能遇到了难以调试的配置问题。
以下是如何开始。使用您需要的任何解释器和脚本,如下定义外部命令:
DEFINE UPLOAD_RESULTS `env GEM_PATH=/usr/lib/ruby/gems/1.9.0 ruby1.9 /home/hadoop/upload_results.rb`;
通过您的脚本流式传输结果:
/* Write our results to our Ruby script for uploading. We add
a trailing bogus DUMP to make sure something actually gets run. */
empty = STREAM results THROUGH UPLOAD_RESULTS;
DUMP empty;
在 Ruby 中,您可以将输入记录批处理为 1024 个块:
STDIN.each_line.each_slice(1024) do |chunk|
# 'chunk' is an array of 1024 lines, each consisting of tab-separated
# fields followed by a newline.
end
如果这不起作用,请仔细检查以下内容:
- 您的脚本可以从命令行运行吗?
- 从 Pig 运行时,您的脚本是否具有所有必要的环境变量?
- 您的 EC2 引导操作是否正常工作?
其中一些很难验证,但如果其中任何一个失败,您很容易浪费大量时间进行调试。
但是请注意,您应该强烈考虑 mat kelcey 推荐的替代方法。