我正在尝试使用Cascading读取文件,并在特定字段上使用Group By。
但它返回源文件中的所有行。
源文件:
no,date,amt
1,3/10/2016,1000
1,3/10/2016,2000
1,3/11/2016,400
232,2/10/2016,1500
代码:
Fields tscnFields = new Fields("no", "date", "amt");
FileTap tscnFileTap = new FileTap(new TextDelimited(tscnFields,true, ","), "C://Users//Test//tscn.txt");
final Fields groupField = new Fields("date");
Pipe pipe = new Pipe("test");
pipe = new Each(pipe, new Debug());
pipe = new GroupBy("group by date", pipe, groupField);
Fields outFields = new Fields("no", "date", "amt");
FileTap sinkTap = new FileTap(new TextDelimited(outFields,true, ","), "C://Users//Test//out.txt", SinkMode.REPLACE); Flow flow = flowConnector.connect("FlowMonitorTest", tscnFileTap, sinkTap, pipe);
flow.complete();
我得到的输出是
['1', '3/10/2016', '1000']
['1', '3/10/2016', '2000']
['1', '3/11/2016', '400']
['232', '2/10/2016', '1500']
tuples count: 4
答案 0 :(得分:1)
如果您想要输出如下所示的输出
date
2/10/2016
3/10/2016
3/10/2016
3/11/2016
然后你必须检查这个代码,它应该按日期对元组进行分组,并仅返回带有日期字段的元组。以下是代码
import java.util.Properties;
import cascading.flow.Flow;
import cascading.flow.FlowDef;
import cascading.flow.local.LocalFlowConnector;
import cascading.operation.Debug;
import cascading.operation.Identity;
import cascading.pipe.Each;
import cascading.pipe.GroupBy;
import cascading.pipe.Pipe;
import cascading.property.AppProps;
import cascading.scheme.local.TextDelimited;
import cascading.tap.Tap;
import cascading.tap.local.FileTap;
import cascading.tuple.Fields;
public class Main {
public static void main(String[] args) {
Tap sourceTap=new FileTap(new TextDelimited(true,","),
"text");
Tap sinkTap=new FileTap(new TextDelimited(true,","),
"output");
Pipe inputPipe=new Pipe("input_to_group");
Fields groupField=new Fields("date");
inputPipe=new Each(inputPipe,new Debug());
inputPipe=new GroupBy(inputPipe,groupField);
inputPipe=new Each(inputPipe,new Fields("date"),new Identity());
Properties properties=new Properties();
AppProps.setApplicationJarClass(properties, Main.class);
FlowDef flowDef=FlowDef.flowDef().addSource(inputPipe, sourceTap)
.addTailSink(inputPipe, sinkTap);
Flow zodiacFlow=new LocalFlowConnector(properties).connect(flowDef);
zodiacFlow.complete();
}
}
希望,这个答案足以满足你的要求! 三江源
答案 1 :(得分:1)
是的,显然你得到的输出与输入相同。
您正在使用字段' date' 对字段进行分组,但对分组的字段数据不执行任何操作,因此您将获得与输出相同的输入。
应该做什么:在对数据进行分组后级联时,我们需要调用缓冲区来处理分组数据(缓冲区调用< strong>每个汇编。)
在上面的示例中,您使用字段&#39; date&#39; 对数据进行分组,因此以下三个组将是每个缓冲区操作的输入:
no,date,amt
1,3/10/2016,1000
1,3/10/2016,2000
no,date,amt
1,3/11/2016,400
no,date,amt
232,2/10/2016,1500
现在,通过这些输入,您可以执行操作来更改输入。
注意:在Hadoop中级联每个数据操作都是在不同的分布式系统中进行的。为了确保并在同一台机器上执行操作,我们进行缓冲操作(需要进行分组)。