只加载pig中的特定字段?

5gfr0r5j  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(207)

这是我的文件: 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 必需的列?

ryevplcw

ryevplcw1#

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

a = load 'input';
b = foreach a generate (chararray) $1 as Col2, (chararray) $2 as Col3;

相关问题