Получение com.univocity.parsers.common.TextParsingException при загрузке файла CSV
Я пытаюсь присоединить набор данных TSV, который имеет много новых строк в данных, к другому фрейму данных и продолжает получать
com.univocity.parsers.common.TextParsingException
Я уже очистил свои данные, чтобы заменить \N на NA, поскольку я думал, что это может быть причиной, но безуспешно.
Ошибка указывает мне на следующую запись в ошибочных данных
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.
3 ответа
Автор 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
вместо.
Надеюсь это поможет
Ответ Джеронимо решит эту проблему.
Просто добавьте образец блока кода на случай, если вам интересно, как сделать эту искру.
val tsvData = spark.read.option("header","true").option("inferSchema",
"true").option("delimiter","\t").option("quote","\0").csv(csvFilePath)
Для тех, кто сталкивается с этой проблемой при чтении широких CSV-файлов в Spark, см. https://spark.apache.org/docs/latest/sql-data-sources-csv.html .
Читатель CSV в Spark имеет настройкуmaxColumns
для которого установлено значение по умолчанию 20480 (начиная с Spark 3.3).
Вы можете увеличить это ограничение, установив его на число, по крайней мере равное ожидаемому количеству столбцов (если оно известно):
spark.read.format("csv").option("header", "true").option("maxColumns", 500000).load(filename)
Имейте в виду, что есть компромисс с увеличением maxColumns — вы заранее выделяете больше памяти, и поэтому в определенный момент у вас закончится память из-за предварительного выделения слишком большого дополнительного пространства.