Apache Flink:CsvReader TAB字段分隔符

时间:2018-05-22 23:31:37

标签: apache-flink

我正在处理一个大 CSV 文件,该文件使用 TAB 来分隔一行中的字段。问题是某些字段之间有多个 TAB 字符。我不想替换字符,因为文件中有大约一百万行。我试过下面的代码,但它不起作用,它显然没有找到分隔符,也没有给我任何输出。
如果我使用 \ t 作为分隔符,我会得到一个输出,但多个 TAB 字符是个问题。

DataSet<Tuple7<String, String, String, String, String, String, String>> ds = env
            .readCsvFile("../csvResources/1.CSV")
            .fieldDelimiter("\t+")
            .ignoreInvalidLines()
            .types(String.class, String.class, String.class, String.class, String.class, String.class, String.class)
            .project(0, 1, 2, 3, 4, 5, 6);

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

目前Flink的内置CsvInputFormat不支持此功能。它会将每个选项卡解释为字段分隔符,并假设某些字段为空。

有两种方法可以解决此问题。

  1. 实现您自己的输入格式(可能是分叉CsvInputFormat)。您基本上需要更改负责将记录拆分为单个字段的逻辑。当您观察字段分隔符(选项卡)时,您需要检查下一个字符是否也是字段分隔符,而不是解析下一个字段。
  2. 按行读取文件(使用TextInputFormat)并解析每一行后续MapFunction
  3. 我建议采用第二种方法。它更易于实施和维护。