通过Apache-Pig-UDF读取javascript文件

通过Apache-Pig-UDF读取javascript文件,javascript,node.js,hadoop,apache-pig,user-defined-functions,Javascript,Node.js,Hadoop,Apache Pig,User Defined Functions,我这里有一些(非常简化的)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 } var fs=requi

我这里有一些(非常简化的)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
}
var fs=require('fs');
var derpfile=String(fs.readFileSync('./derp.txt',utf-8');
var derps=derpfile.split('\n');
对于(变量i=0;i
问题是,我不能使用Pig UDF中的节点(我知道;如果我可以这样做,请!)。当我看javascript中的“文件io”时,我看到的所有教程都在浏览器沙箱中。我需要从文件系统中读取一个文件,比如
hdfs:///foo/bar/baz/jane/derps.txt
,我不能保证它会在CWD中,但我有权访问它。所有这些教程似乎都涉及异步读取。我确实需要在这里进行阻塞调用,因为在读取此文件之前,清管器作业无法开始。还有很多关于如何从另一个站点拉下URL的解释


这是一种令人难以置信的沮丧,因为使用Java完成这项任务是可怕的过度使用,javascript确实是这项工作的正确工具(好吧,好吧,perl是,但我不能选择它…),我在一些简单的事情上束手无策,比如基本文件IO(

我无法谈论您对JavaScript的使用,因为我从未用它编写过UDF,但一般来说,文件访问不是在UDF内部完成的,特别是当您试图访问HDFS上的某些内容时。HDFS上的文件是通过NameNode访问的,因此,一旦您在DataNode上执行,您就运气不佳。您需要将文件放在di中交叉缓存

Pig可以通过执行
连接来为您做到这一点。如果文件适合内存,您可以执行复制连接,这将利用分布式缓存。我将使用Pig将文件加载到一个关系中,使用
组关系ALL
将其放入一个包中,然后
将此包与您的关系中的所有记录交叉兴趣。然后您可以将此包传递给任何您喜欢的自定义项。例如:

a = LOAD 'a' AS ...;
f = LOAD '/the/file/you/want' AS ...;

/* Put everything into a single bag */
f_bag = FOREACH (GROUP f ALL) GENERATE f;
/* Now you have a relation with one record;
   that record has one field: the bag, f */
a2 = CROSS a, f_bag;
/* Now you have duplicated a and appended
   the bag f to each record */

b = FOREACH a2 GENERATE yourUDF(field1, field2, f)

所以这里的问题是。最初,这是我运行代码的方式,但是在一个文件中跨越数千条记录,在另一个文件中跨越数千万条记录很快就会出现问题。你不会跨越数千条记录,你只会跨越一条。
f_bag
中只有一条记录。我发现我在e代码——我已经更新了它,所以正确的关系被交叉了。