Cascading 级联-按字段名称分组问题
我正在尝试使用级联读取文件,并在特定字段上使用Group By 但它会返回源文件中的所有行 源文件:Cascading 级联-按字段名称分组问题,cascading,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,t
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();
代码:
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
如果您想要如下所示的输出
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();
}
}
希望这个答案能满足你的要求如果您想要下面给出的输出,谢谢
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();
}
}
希望这个答案能满足你的要求谢谢是的,很明显,您得到的输出与输入相同 您正在使用字段“日期”对字段进行分组,但对分组后的字段数据不做任何处理,因此您将获得与输出相同的输入 应该做什么:在分组数据后的级联中,我们需要调用缓冲区来处理分组数据(Buffer调用每个程序集) 在上面的示例中,您使用字段'date'对数据进行分组,因此以下三个组将成为每个缓冲区操作的输入:
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级联中,每个数据操作都在不同的分布式系统中执行。为了确保并在同一台机器上执行该操作,我们执行了缓冲区操作(需要对其进行分组)。是的,显然您得到的输出与输入相同 您正在使用字段“日期”对字段进行分组,但对分组后的字段数据不做任何处理,因此您将获得与输出相同的输入 应该做什么:在分组数据后的级联中,我们需要调用缓冲区来处理分组数据(Buffer调用每个程序集) 在上面的示例中,您使用字段'date'对数据进行分组,因此以下三个组将成为每个缓冲区操作的输入:
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级联中,每个数据操作都在不同的分布式系统中执行。为了确保并在同一台机器上执行操作,我们执行缓冲区操作(需要分组)。您想要什么类型的输出?您想要什么类型的输出?