Spark Univocity解析器-LineSeparatorDetection无法正常工作

时间:2019-07-18 14:28:16

标签: scala csv apache-spark univocity

我正在尝试使用具有以下选项的univocity csv解析器来解析this csv文件

选项:

HEADER -> true
DELIMITERS -> ,
MULTILINE -> true
DEFAULT_TIME_STAMP -> yyyy/MM/dd HH:mm:ss ZZ
IGNORE_TRAILING_WHITE_SPACE -> false
IGNORE_LEADING_WHITE_SPACE -> false
TIME_ZONE -> Asia/Kolkata
COLUMN_PRUNING -> true
ESCAPE -> "\""

val csvOptionsObject = new CSVOptions(readerOptions, COLUMN_PRUNING , TIME_ZONE)
val parserInstance = csvOptionsObject.asParserSettings
parserInstance.setLineSeparatorDetectionEnabled(true)
val parserObject = new CsvParser(parserInstance)
val readerStream = parserObject.beginParsing(dataObj.getInputStream, csvOptionsObject.charset)
val row = parserObject.parseNext()

文件有30列,但是当我解析时,它显示为2302行。

文件以\ r作为行分隔符。 (如我在解析时所见)

将行分隔符明确设置为\ r可解决此问题。 但是,我还将使用\ n作为分隔符的文件替换为\ r。 要解决此设置,setNormalizedLineEndingWithinQuotes(false)可以解决,但对引用了所有值的其他文件无效。(再次无法检测到分隔符)。

是否有可能解决?

1 个答案:

答案 0 :(得分:0)

默认情况下,使用spark CSVOptions中的asParserSettings将inputBufferSize更改为128(spark中的默认值),而univocity csv解析器中的默认值为1048576。

添加此代码解决了问题,

val csvOptionsObject = new CSVOptions(readerOptions, COLUMN_PRUNING , TIME_ZONE)
val parserInstance = csvOptionsObject.asParserSettings
parserInstance.setLineSeparatorDetectionEnabled(true)
parserInstance.setInputBufferSize(1048576) // Setting it to match univocity parser's default value
val parserObject = new CsvParser(parserInstance)
val readerStream = parserObject.beginParsing(dataObj.getInputStream, csvOptionsObject.charset)
val row = parserObject.parseNext()