我正在阅读一个大文件(超过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)
欣赏你的想法......
答案 0 :(得分: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上的大量表和FOREACH将组(f1,f2,f3,f4)与关联包传递给用Java编写的自定义函数,将小文件的相应分区加载到RAM并执行扩充。