这是我的文件:
Col1, Col2, Col3, Col4, Col5
我只需要Col2
和Col3
。
目前,我正在这样做:
a = load 'input' as (Col1:chararray,
Col2:chararray,
Col3:chararray,
Col4:chararray);
b = foreach a generate Col2, Col3;
有没有办法只直接加载Col2
而Col3
不是先加载整个列input
,然后再加载generate
所需列?
您只GENERATE
查找所需列的方法是一种有效执行您所要查询的方法的方法。请记住,所有数据都存储在HDFS上,并且在启动脚本时不会将所有数据都加载到内存中。即使您没有保留这些字节以供处理时,仍然必须从磁盘上读取这些字节,因此从不加载该数据没有性能优势。优点在于您不必将其发送到您的方法即可完成的reducer。
如果Pig可以告诉您将不使用某个列,它将立即“修剪”它,从本质上为您完成了对您所做的操作b = foreach a generate Col2, Col3;
。但是,如果您使用的UDF可能会访问其他字段,则不会发生这种情况,因为Pig不会查看UDF的内部以查看它们是否被使用。例如,假设Col3
是一个int
。如果你有
b = group a by Col2;
c = foreach b generate group, SUM(a.Col3);
那么Pig会自动为您修剪第一和第四列,因为它可以看到它们从未被使用过。但是,如果您改为
b = group a by Col2;
c = foreach b generate group, COUNT(a);
那么Pig无法修剪,因为它在COUNT
UDF中看不到,也不知道不会使用其他字段。如果不确定Pig是否会执行此修剪操作,则可以使用现有的foreach
/generate
方法。当您启动脚本时,Pig应该打印一条诊断消息,列出它能够删除的所有列。
相反,如果您的问题是只对几列感兴趣时不想提供完整的架构,则可以完全跳过该架构并将其放在GENERATE
:
a = load 'input';
b = foreach a generate (chararray) $1 as Col2, (chararray) $2 as Col3;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句