在Flink中解析CSV时,引号字段内的转义引号

在Flink中解析CSV时,引号字段内的转义引号,csv,apache-flink,Csv,Apache Flink,在Flink中,使用readCsvFile解析CSV文件会在遇到包含引号的字段时引发异常,如“Fazenda Saão Jose”“OB”“Airport”: 我在邮件列表线程和JIRA问题中发现,字段内的引用应该通过\字符实现,但我无法控制修改它的数据。有办法解决这个问题吗 我也尝试过使用ignoreInvalidLines()(这是不太可取的解决方案),但它给了我以下错误: 08:49:05,737 INFO org.apache.flink.api.common.io.Locatable

在Flink中,使用readCsvFile解析CSV文件会在遇到包含引号的字段时引发异常,如
“Fazenda Saão Jose”“OB”“Airport”

我在邮件列表线程和JIRA问题中发现,字段内的引用应该通过\字符实现,但我无法控制修改它的数据。有办法解决这个问题吗

我也尝试过使用
ignoreInvalidLines()
(这是不太可取的解决方案),但它给了我以下错误:

08:49:05,737 INFO  org.apache.flink.api.common.io.LocatableInputSplitAssigner    - Assigning remote split to host localhost
08:49:05,765 ERROR org.apache.flink.runtime.operators.BatchTask                  - Error in task code:  CHAIN DataSource (at main(Job.java:53) (org.apache.flink.api.java.io.TupleCsvInputFormat)) -> Map (Map at main(Job.java:54)) -> Combine(SUM(1), at main(Job.java:56) (2/8)
java.lang.ArrayIndexOutOfBoundsException: -1
    at org.apache.flink.api.common.io.GenericCsvInputFormat.skipFields(GenericCsvInputFormat.java:443)
    at org.apache.flink.api.common.io.GenericCsvInputFormat.parseRecord(GenericCsvInputFormat.java:412)
    at org.apache.flink.api.java.io.CsvInputFormat.readRecord(CsvInputFormat.java:111)
    at org.apache.flink.api.common.io.DelimitedInputFormat.nextRecord(DelimitedInputFormat.java:454)
    at org.apache.flink.api.java.io.CsvInputFormat.nextRecord(CsvInputFormat.java:79)
    at org.apache.flink.runtime.operators.DataSourceTask.invoke(DataSourceTask.java:176)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:559)
    at java.lang.Thread.run(Thread.java:745)
这是我的密码:

DataSet<Tuple2<String, Integer>> csvInput = env.readCsvFile("resources/airports.csv")
            .ignoreFirstLine()
            .ignoreInvalidLines()
            .parseQuotedStrings('"')
            .includeFields("100000001")
            .types(String.class, String.class)
            .map((Tuple2<String, String> value) -> new Tuple2<>(value.f1, 1))
            .groupBy(0)
            .sum(1);
DataSet csvInput=env.readCsvFile(“resources/airports.csv”)
.ignoreFirstLine()
.ignoreInvalidLines()
.ParseQuotedString(“”)
.includefelds(“100000000001”)
.types(String.class、String.class)
.map((Tuple2值)->新的Tuple2(value.f1,1))
.groupBy(0)
.总数(1);

如果无法更改输入数据,则应关闭
parseQuotedString()
。这将只需查找下一个字段分隔符,并以字符串形式返回中间的所有内容(包括引号)。然后,您可以在后续映射操作中删除前导引号和尾随引号。

如果我禁用
parseQuotedString()
,带有包含字段分隔符的字段的行将无法正确解析。我需要忽略字段中的引号和逗号。嗯,这是个问题。然后我想你应该转换输入数据,以便内部引号转义。但是,无可否认,我们也可以尝试在Flink中通过简单计算任何已经看到的引用字符。但目前不支持。
DataSet<Tuple2<String, Integer>> csvInput = env.readCsvFile("resources/airports.csv")
            .ignoreFirstLine()
            .ignoreInvalidLines()
            .parseQuotedStrings('"')
            .includeFields("100000001")
            .types(String.class, String.class)
            .map((Tuple2<String, String> value) -> new Tuple2<>(value.f1, 1))
            .groupBy(0)
            .sum(1);