Spark TSV файл и неверный столбец плевать - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть файл TSV со многими строками.Большая часть строк работает нормально, но у меня есть проблема работы со следующей строкой:

tt7841930   tvEpisode   "Stop and Hear the Cicadas/Cold-Blooded "Stop and Hear the Cicadas/Cold-Blooded 0   2018    \N  24  Animation,Family

Я использую Spark и Scala для загрузки файла в DataFrame:

val titleBasicsDf = spark.read
  .format("org.apache.spark.csv")
  .option("header", true)
  .option("inferSchema", true)
  .option("delimiter", "    ")
  .csv("title.basics.tsv.gz")

В результате я получаю:

+---------+---------+-------------------------------------------------------------------------------+-------------+-------+---------+-------+----------------+------+-------------+--------+------------+------------+-------------+
|tconst   |titleType|primaryTitle                                                                   |originalTitle|isAdult|startYear|endYear|runtimeMinutes  |genres|averageRating|numVotes|parentTconst|seasonNumber|episodeNumber|
+---------+---------+-------------------------------------------------------------------------------+-------------+-------+---------+-------+----------------+------+-------------+--------+------------+------------+-------------+
|tt7841930|tvEpisode|"Stop and Hear the Cicadas/Cold-Blooded    "Stop and Hear the Cicadas/Cold-Blooded|0            |2018   |\N       |24     |Animation,Family|null  |null         |null    |tt4947580   |6           |2            |
+---------+---------+-------------------------------------------------------------------------------+-------------+-------+---------+-------+----------------+------+-------------+--------+------------+------------+-------------+

Итак, как вы можете видеть, следующие данные в строке:

"Stop and Hear the Cicadas/Cold-Blooded "Stop and Hear the Cicadas/Cold-Blooded

неправильно разделены на два разных значения для primaryTitle и originalTitle столбцов и primaryTitle содержит оба из них:

{
   "runtimeMinutes":"Animation,Family",
   "tconst":"tt7841930",
   "seasonNumber":"6",
   "titleType":"tvEpisode",
   "averageRating":null,
   "originalTitle":"0",
   "parentTconst":"tt4947580",
   "startYear":null,
   "endYear":"24",
   "numVotes":null,
   "episodeNumber":"2",
   "primaryTitle":"\"Stop and Hear the Cicadas/Cold-Blooded\t\"Stop and Hear the Cicadas/Cold-Blooded",
   "isAdult":2018,
   "genres":null
}

Что я делаю не так и как настроить Spark для правильного понимания и разделения этой строки?Как я упоминал ранее, многие другие строки этого файла правильно разделены на соответствующие столбцы.

1 Ответ

0 голосов
/ 25 ноября 2018

Я нашел ответ здесь: https://github.com/databricks/spark-csv/issues/89

Способ отключения экранирования по умолчанию символа двойной кавычки (") с помощью символа обратной косой черты () - т.е. чтобы избежать экранирования для всехполностью, после вызова метода .write () необходимо добавить вызов метода .option () с правильными параметрами. Цель вызова метода option () - изменить способ, которым метод csv () «находит» экземплярысимвол «кавычка» в том виде, в котором он выводит содержимое. Для этого необходимо изменить значение по умолчанию того, что на самом деле означает «кавычка», т. е. изменить искомый символ с символа двойной кавычки («) на Юникод» \ u0000"(в сущности, предоставляя символ Unicode NUL, предполагая, что он никогда не появится в документе).

следующий магический вариант добился цели:

.option("quote", "\u0000")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...