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

标签 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
}

问题是,我不能在Pig UDF的节点上使用节点(我知道;如果可以,请let me know!)。当我用javascript查看“文件io”时,我看到的所有教程都在浏览器沙箱中。我需要从文件系统中读取一个文件,例如hdfs:///foo/bar/baz/jane/derps.txt,我不能保证它将在CWD中,但是我将具有访问权限。所有这些教程似乎都涉及异步读取。我真的需要在这里进行阻塞调用,因为在读取此文件之前,pig作业无法开始。关于如何从另一个站点提取URL的解释也很多。

使用Java来完成这项任务实在令人沮丧,这太可怕了,而javascript确实是工作的正确工具(好吧,perl是,但是我没有选择那个……),我破坏像基本文件IO一样简单的东西。 :(

最佳答案

由于我从未使用过JavaScript编写过UDF,因此我无法与您谈论JavaScript的使用,但是通常来说,文件访问不是在UDF内部完成的,尤其是当您尝试访问HDFS上的内容时。 HDFS上的文件可通过NameNode进行访问,因此,在DataNode上执行文件后,您会很走运。您需要将文件放置在分布式缓存中。

Pig可以通过执行JOIN为您做到这一点。如果文件适合内存,则可以执行复制联接,这将利用分布式缓存。我将使用Pig将文件加载到一个关系中,使用GROUP relation ALL将其放入单个包中,然后对该文件以及与您感兴趣的关系中的所有记录进行CROSS。然后,您可以将此包装袋传递给您喜欢的任何UDF。就像是:

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)

关于javascript - 通过Apache Pig UDF读取javascript文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19841375/

相关文章:

javascript - Angular 5 GET 请求无响应

javascript - 为 JavaScript 构建过程工具

javascript - Css 背景箭头百分比宽度

javascript - Vue组件抛出错误: Cannot set property 'render' of undefined

mysql - 无法获取和读取 GET 请求

sql - Hadoop 数据- 在 SQL 助手中将字符串时间戳转换为 Hadoop 日期

hadoop - 使用 KMS 在配置单元中进行列级加密

node.js - 您如何获得在 https 中使用的 key 和证书对?

javascript - div 的 Vue Router

json - 德鲁伊 Parquet 摄取性能差