Cascading 级联-按字段名称分组问题

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

我正在尝试使用级联读取文件,并在特定字段上使用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();
代码:

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级联中,每个数据操作都在不同的分布式系统中执行。为了确保并在同一台机器上执行操作,我们执行缓冲区操作(需要分组)。

您想要什么类型的输出?您想要什么类型的输出?