我这里有一些(非常简化的)nodejs代码:
var fs = require('fs');
var derpfile = String(fs.readFileSync( './derp.txt', 'utf-8' ));
var derps = derpfile.split( '\n' );
for (var i = 0; i < derps.length; ++i) {
// do something with my derps here
}
问题是,我不能在pig udf中使用node(我知道;如果我能做到,请告诉我。当我在javascript中查看“file io”时,我看到的所有教程都在浏览器沙盒中。我需要从文件系统中读取一个文件,比如 hdfs:///foo/bar/baz/jane/derps.txt
,我不能保证它会出现在cwd中,但我有权访问它。所有这些教程似乎还涉及异步读取。我真的需要有一个阻塞调用在这里,因为Pig的工作不能开始,直到这个文件被读取。还有很多关于如何从另一个站点拉下url的解释。
这是一种令人难以置信的挫败,因为使用java来完成这项任务是一种可怕的过度使用,javascript确实是这项工作的合适工具(好吧,好吧,perl是,但我不能选择这个……),我在一些简单的事情上束手无策,比如基本文件io(
1条答案
按热度按时间dojqjjoe1#
我不能谈论你对javascript的使用,因为我从来没有用它编写过udf,但一般来说,文件访问不是在udf内部完成的,尤其是当你试图访问hdfs上的东西时。hdfs上的文件是通过namenode访问的,因此一旦您在datanode上执行,您就走运了。您需要将文件放在分布式缓存中。
小Pig可以帮你做一件事
JOIN
. 如果文件适合内存,可以执行复制连接,这将利用分布式缓存。我将使用pig将文件加载到关系中,使用GROUP relation ALL
把它放进一个袋子里,然后CROSS
这个包里有你感兴趣的所有记录。然后你可以把这个包递给任何你喜欢的人。比如: