如何在Flink中连续读取CSV文件并删除标题

时间:2017-08-02 20:20:48

标签: csv datasource apache-flink pojo

我正在使用Flink流API,我想继续从文件夹中读取CSV文件,忽略标头并将CSV文件中的每一行转换为Java类(POJO)。完成所有这些处理之后,我应该获得一个Java对象流(POJO)。

到目前为止,我执行以下操作以部分实现行为(代码如下):

  • 将CSV文件作为常规文本文件连续
  • 读取
  • 从CSV文件中获取字符串流
  • 将字符串流转换为Java对象流

    String path = "/home/cosmin/Projects/flink_projects/flink-java-project/data/";
    TextInputFormat format = new TextInputFormat(
            new org.apache.flink.core.fs.Path(path));
    DataStream<String> inputStream = streamEnv.readFile(format, path, FileProcessingMode.PROCESS_CONTINUOUSLY, 100);
    
    DataStream<MyEvent> parsedStream = inputStream
        .map((line) -> {
            String[] cells = line.split(",");
            MyEvent event = new MyEvent(cells[1], cells[2], cells[3]);
            return event;
        });
    

但是,由此我无法删除每个CSV文件中的标题行。

我已经读过,我可以使用StreamExecutionEnvironment类上的createInput()addSource ()方法构建用于读取CSV文件的自定义连接器。

您能否提供一些有关如何实现这一目标的指导,因为我还没有找到Javadoc之外的任何示例?

1 个答案:

答案 0 :(得分:0)

您可以在地图功能之前链接过滤器功能以过滤掉标题行

inputStream.filter(new FilterFunction<String>() {
    public boolean filter(String line) { 
        if (line.contains("some header identifier")) return false;
        else return true;
    }
}).map(...)     <Your map function as before>