Pig 脚本:加入多个文件

Posted

技术标签:

【中文标题】Pig 脚本:加入多个文件【英文标题】:Pig Script: Join with multiple files 【发布时间】:2012-09-12 14:17:34 【问题描述】:

我正在读取一个大文件(超过 10 亿条记录)并将其与其他三个文件连接起来,我想知道是否有任何方法可以更有效地避免对大表进行多次读取。小表可能不适合内存。

A = join smalltable1 by  (f1,f2) RIGHT OUTER,massive by (f1,f2) ;
B = join smalltable2 by  (f3) RIGHT OUTER, A by (f3) ;
C = join smalltable3 by  (f4) ,B by (f4) ;

我正在考虑的替代方法是编写一个 udf 并在一次读取中替换值,但我不确定 udf 是否有效,因为小文件不适合内存。实现可能是这样的:

A = LOAD massive 
B = generate f1,udfToTranslateF1(f1),f2,udfToTranslateF2(f2),f3,udfToTranslateF3(f3)

欣赏你的想法...

【问题讨论】:

【参考方案1】:

Pig 0.10 引入了与 Bloom Filters 的集成 http://search-hadoop.com/c/Pig:/src/org/apache/pig/builtin/Bloom.java%7C%7C+%2522done+%2522exec+Tuple%2522

您可以在 3 个较小的文件上训练布隆过滤器并过滤大文件,希望它会产生更小的文件。之后执行标准连接以获得 100% 的精度。

更新 1 当您加入不同的键时,您实际上需要训练 2 个布隆过滤器,每个小表一个。

更新 2 cmets 中提到外连接用于扩充数据。 在这种情况下,布隆过滤器可能不是最好的选择,它们适用于过滤而不是在外部连接中添加数据,因为您希望保留不匹配的数据。更好的方法是对各个字段(f1、f2、f3、f4)上的所有小表进行分区,将每个分区存储到一个足够小的单独文件中以加载到内存中。比 f1、f2、f3、f4 和 FOREACH 上的 Group BY 大表将带有关联包的组 (f1、f2、f3、f4) 传递给用 Java 编写的自定义函数,该函数将小文件的各个分区加载到RAM 并执行增强。

【讨论】:

谢谢alexeipab。您针对不同值优化猪组加入的解决方案对我有用..所以我相信这也可以..我会在实施后更新帖子。 当您加入不同的键时,实际上需要训练 2 个布隆过滤器,每个小表一个。 顺便说一句,在您的情况下,外连接的目的是什么?是给大表增加额外的列还是得到与小表不匹配的行? 在可用信息的地方添加额外的列。然后我必须分组并得到总数。 我已经更新了这个问题。实际上有 3 张小桌子,这些都不足以容纳内存。一张小表大约有30M条记录,但只有3M在使用,但我们事先不知道是哪个3M。

以上是关于Pig 脚本:加入多个文件的主要内容,如果未能解决你的问题,请参考以下文章

使用相同的 Pig 脚本存储多个文件

用于过滤多个字符串上的文件的 Pig 脚本/命令

PIG 脚本根据特定单词将大型文本文件拆分为多个部分

Pig 多个存储命令创建重复工作

Pig 处理多个文件错误:错误 0:在 [] 处执行 ForEach 时出错

如何从 Apache Pig 中的文件中读取多个文件?