通过apache pig udf读取javascript文件

mkshixfv  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(273)

我这里有一些(非常简化的)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(

dojqjjoe

dojqjjoe1#

我不能谈论你对javascript的使用,因为我从来没有用它编写过udf,但一般来说,文件访问不是在udf内部完成的,尤其是当你试图访问hdfs上的东西时。hdfs上的文件是通过namenode访问的,因此一旦您在datanode上执行,您就走运了。您需要将文件放在分布式缓存中。
小Pig可以帮你做一件事 JOIN . 如果文件适合内存,可以执行复制连接,这将利用分布式缓存。我将使用pig将文件加载到关系中,使用 GROUP relation ALL 把它放进一个袋子里,然后 CROSS 这个包里有你感兴趣的所有记录。然后你可以把这个包递给任何你喜欢的人。比如:

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)

相关问题