1

我正在读取一个大文件(超过 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)

欣赏你的想法...

4

1 回答 1

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

于 2012-09-13T10:59:51.290 回答