flink apache:什么是最有效的:读取文件并将文本拆分为元组或读取csv

时间:2017-03-30 20:14:24

标签: apache-flink

我做了这个小代码来将文件夹中的文件放在数据流中:

public class TextFromDirStream {

//
//  Program
//

public static void main(String[] args) throws Exception {

    // set up the execution environment
    final StreamExecutionEnvironment env = StreamExecutionEnvironment
            .getExecutionEnvironment();

    // monitor directory, checking for new files
    // every 100 milliseconds
    TextInputFormat format = new TextInputFormat(
            new org.apache.flink.core.fs.Path("file:///tmp/dir/"));

    DataStream<String> inputStream = env.readFile(
            format,
            "file:///tmp/dir/",
            FileProcessingMode.PROCESS_CONTINUOUSLY,
            100,
            FilePathFilter.createDefaultFilter());

    inputStream.print();

    // execute program
    env.execute("Java read file from folder Example");
}

}

我的下一步是处理文件内容(csv)。处理这个问题最有效的方法是什么?我是否更改了我的代码以解析文本文件inputStream,并从头开始将其转换为元组或readFile为CSV。我问这个问题是因为我很难找到关于如何将文本拆分为元组的示例或文档。

提前谢谢

1 个答案:

答案 0 :(得分:2)

从您的代码开始,流中的每个事件(inputStream)都是一行作为String。您只需将一行映射到TupleX:

DataStream<Tuple2<Long, String>> parsedStream = inputStream
   .map((line) -> {
     String[] cells = line.split(",");
     // Only keep first and third cells
     return new Tuple2(Long.parseLong(cells[2]), cells[0]); 
   });

您还可以使用readCsvFile,其中包括字段选择,并且能够创建TupleX或POJO(但是没有PROCESS_CONTINUOUSLY与readCsvFile)。另请注意,如果您使用PROCESS_CONTINUOUSLY,则将完全(再次)处理每个已修改的文件,这与完全不匹配!