这是我的文件: 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
必需的列?
1条答案
按热度按时间ryevplcw1#
你的方法只是
GENERATE
对你想要的栏目进行分类是按你的要求做的一种有效方法。请记住,所有数据都存储在hdfs上,并且在启动脚本时不会将其全部加载到内存中。即使在处理过程中没有保留这些字节,您仍然必须从磁盘上读取这些字节,因此从不加载这些数据对性能没有好处。优点在于不必将其发送到减速器,这是您用自己的方法完成的。如果pig能判断出某个列将不被使用,它会立即“修剪”它,基本上是为你做你用你的列所做的事情
b = foreach a generate Col2, Col3;
. 但是,如果您使用的是可能访问其他字段的自定义项,则不会发生这种情况,因为pig不会查看自定义项的内部以查看它们是否被使用。例如,假设Col3
是一个int
. 如果你有然后pig会自动为您修剪第一列和第四列,因为它可以看到它们从未被使用过。但是,如果你真的这么做了
那Pig就不能修剪了,因为它看不见树的内部
COUNT
并且不知道其他字段不会被使用。当你怀疑Pig是否会做这种修剪时,你可以使用foreach
/generate
你已有的方法。pig应该在启动脚本时打印一条诊断消息,列出它能够删减的所有列。相反,如果您的问题是当您只对几列感兴趣时不想提供完整的模式,那么您可以完全跳过该模式并将其放入
GENERATE
: