我正在尝试加入一个tsv数据集,该数据集在数据中有许多新行到另一个数据帧并继续获取
com.univocity.parsers.common.TextParsingException
我已经清理了我的数据,用NAs代替\ N,因为我认为这可能是原因,但没有成功。
该错误将我指向错误数据中的以下记录
tt0100054 2苍蝇大师SUHH ru NA NA 0
堆栈跟踪如下
19/03/02 17:45:42 ERROR Executor: Exception in task 0.0 in stage 10.0 (TID 10)
com.univocity.parsers.common.TextParsingException: Length of parsed input (1000001) exceeds the maximum number of characters defined in your parser settings (1000000).
Identified line separator characters in the parsed content. This may be the cause of the error. The line separator in your parser settings is set to '\n'. Parsed content:
Sesso e il poliziotto sposato IT NA NA NA 0[\n]
tt0097089 4 Sex and the Married Detective US NA NA NA 0[\n]`tt0100054 1 Fluenes herre NO NA imdbDisplay NA 0
tt0100054 20 Kärpästen herra FI NA NA NA 0
tt0100054 2
at com.univocity.parsers.common.AbstractParser.handleException(AbstractParser.java:302)
at com.univocity.parsers.common.AbstractParser.parseNext(AbstractParser.java:431)
at org.apache.spark.sql.execution.datasources.csv.BulkCsvReader.next(CSVParser.scala:148)
at org.apache.spark.sql.execution.datasources.csv.BulkCsvReader.next(CSVParser.scala:131)
at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
at org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:91)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:370)
at org.apache.spark.sql.execution.SparkPlan$$anonfun$4.apply(SparkPlan.scala:246)
at org.apache.spark.sql.execution.SparkPlan$$anonfun$4.apply(SparkPlan.scala:240)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$24.apply(RDD.scala:803)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$24.apply(RDD.scala:803)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70)
at org.apache.spark.scheduler.Task.run(Task.scala:86)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1000000
at com.univocity.parsers.common.input.AbstractCharInputReader.appendUtilAnyEscape(AbstractCharInputReader.java:331)
at com.univocity.parsers.csv.CsvParser.parseQuotedValue(CsvParser.java:246)
at com.univocity.parsers.csv.CsvParser.parseRecord(CsvParser.java:119)
at com.univocity.parsers.common.AbstractParser.parseNext(AbstractParser.java:400)
... 22 more
我已经尝试在csv选项(“maxCharsPerCol”,“110000000”).option(“multiLine”,“true”)中设置以下内容,但它没有帮助。我很感激任何帮助解决这个问题。
我正在使用spark 2.0.2和scala 2.11.8。
univocity-parsers
的作者在这里。
解析器的构建是为了在程序(即文件格式配置不正确)或输入文件(即输入文件没有程序所期望的格式,或未转换/未关闭)的情况下可能出现错误时快速失败引号)。
堆栈跟踪显示:
Sesso e il poliziotto sposato IT NA NA NA 0[\n]
tt0097089 4 Sex and the Married Detective US NA NA NA 0[\n]`tt0100054 1 Fluenes herre NO NA imdbDisplay NA 0
tt0100054 20 Kärpästen herra FI NA NA NA 0
tt0100054 2
这清楚地显示了多行的内容被读取,就好像它们是单个值的一部分一样。这意味着在输入文件中此文本周围的某些值以从未关闭的引号开头。
您可以将解析器配置为不尝试使用以下方法处理引用的值:
settings.getFormat().setQuote('\0');
如果您确定您的格式配置正确并且输入中有很长的值,请将maxCharsPerColumn
设置为-1
。
最后,看起来你正在解析TSV,它不是CSV,应该以不同的方式处理。如果是这种情况,您也可以尝试使用TsvParser
。
希望这可以帮助