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 脚本:加入多个文件的主要内容,如果未能解决你的问题,请参考以下文章