Com*_*low 10 hadoop mapreduce apache-pig
这是我的档案:
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;
Run Code Online (Sandbox Code Playgroud)
有没有办法直接加载Col2而Col3不是加载整个input然后generate需要的列?
reo*_*toa 15
只有GENERATE你想要的列的方法才能有效地完成你的要求.请记住,所有数据都存储在HDFS上,并且在启动脚本时不会将其全部加载到内存中.即使您没有保留它们以便在处理中使用,您仍然必须从磁盘读取这些字节,因此从不加载该数据没有性能优势.优点在于永远不必将其发送到您使用您的方法完成的减速器.
如果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);
Run Code Online (Sandbox Code Playgroud)
然后猪会自动修剪第1和第4列,因为它可以看到它们从未使用过.但是,如果你做了
b = group a by Col2;
c = foreach b generate group, COUNT(a);
Run Code Online (Sandbox Code Playgroud)
然后猪不能修剪,因为它没有看到COUNTUDF 内部并且不知道其他字段将不会被使用.当怀疑Pig是否会进行修剪时,您可以使用已有的foreach/ generate方法.当您启动脚本列出它能够修剪的所有列时,Pig应该打印一条诊断消息.
如果您的问题是,当您只对几列感兴趣时,您不希望提供完整的架构,则可以完全跳过架构并将其放入GENERATE:
a = load 'input';
b = foreach a generate (chararray) $1 as Col2, (chararray) $2 as Col3;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14156 次 |
| 最近记录: |