加载CSV文件时,获取com.univocity.parsers.common.common.textparsingex



我正在尝试加入一个TSV数据集,该数据集在数据中有很多新行与另一个dataframe,并继续获取

com.univocity.parsers.common.textparsingexception

我已经清理了数据以用NAS替换 n,因为我认为这可能是原因,但没有成功。

错误指出了错误数据中的以下记录

tt0100054 2公斤

堆叠如下

    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")。我感谢任何解决此问题的帮助。

我正在使用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('');

如果您确定格式配置正确并且输入中的值很长,请将maxCharsPerColumn设置为-1

最后,看来您正在解析TSV,这不是CSV,应以不同的方式处理。如果是这样,您也可以尝试使用TsvParser

希望这有帮助

Jeronimo的答案将解决此问题。

只需添加示例代码块,以防您想知道如何做这个火花。

val tsvData = spark.read.option("header","true").option("inferSchema",
"true").option("delimiter","t").option("quote","").csv(csvFilePath)

对于遇到此问题的任何人,请阅读Spark中的宽CSV文件,请参阅https://spark.apache.org/docs/latest/sql-data-sources-csv.html

Spark中的CSV阅读器具有一个设置maxColumns,该设置为20480(从Spark 3.3)设置为默认值。

您可以通过将其设置为至少与预期的列数(如果已知)的数字来增加此限制:

spark.read.format("csv").option("header", "true").option("maxColumns", 500000).load(filename)

请记住,随着MaxColumms的增加,您会进行折衷 - 您正在预先列出更多的内存,因此,在某个时刻,您将无法预先置入过多的额外空间。

相关内容

  • 没有找到相关文章

最新更新