Flink数据流CSV编写器未将数据写入CSV文件

时间:2019-01-03 07:16:44

标签: csv apache-flink

我是不熟悉apache flink并尝试学习数据流的新手。我正在从csv文件读取具有3列(名称,主题和标记)的学生数据。我对标记应用了过滤器,仅选择标记> 40的那些记录。 我正在尝试将此数据写入csv文件,但程序成功运行,并且csv文件仍然为空。没有数据写入csv文件。

我尝试使用不同的语法编写csv文件,但没有一个对我有用。我正在通过Eclipse在本地运行。写入文本文件效果很好。

DataStream<String> text = env.readFile(format, params.get("input"), 
FileProcessingMode.PROCESS_CONTINUOUSLY,100);
DataStream<String> filtered = text.filter(new FilterFunction<String>(){
public boolean filter(String value) {
    String[] tokens = value.split(",");
    return Integer.parseInt(tokens[2]) >= 40;
}
});
filtered.writeAsText("testFilter",WriteMode.OVERWRITE);
DataStream<Tuple2<String, Integer>> tokenized = filtered
.map(new MapFunction<String, Tuple2<String, Integer>>(){
public Tuple2<String, Integer> map(String value) throws Exception {
    return new Tuple2("Test", Integer.valueOf(1));
}
});
tokenized.print(); 
tokenized.writeAsCsv("file:///home/Test/Desktop/output.csv", 
WriteMode.OVERWRITE, "/n", ",");
try {
env.execute();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}

下面是我输入的CSV格式:

Name1,Subj1,30
Name1,Subj2,40
Name1,Subj3,40
Name1,Subj4,40

Tokenized.print()打印所有正确的记录。

2 个答案:

答案 0 :(得分:0)

我做了一些实验,发现这项工作效果很好:

import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.core.fs.FileSystem;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class WriteCSV {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        env.setParallelism(1);

        env.fromElements(new Tuple2<>("abc", 1), new Tuple2<>("def", 2))
                .writeAsCsv("file:///tmp/test.csv", FileSystem.WriteMode.OVERWRITE, "\n", ",");

        env.execute();
    }
}

如果我没有将并行度设置为1,则结果会有所不同。在这种情况下,test.csv是一个包含四个文件的目录,每个文件由四个并行子任务之一写入。

我不确定您的情况有什么问题,但是也许您可以从该示例中倒退(假设它对您有用)。

答案 1 :(得分:0)

您应在tokenized.print();之前删除tokenized.writeAsCsv();

它将消耗数据print();