级联 - 按字段名称分组

时间:2016-03-22 13:19:48

标签: 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,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

2 个答案:

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