Как загрузить файл CSV с записями в несколько строк? - PullRequest
0 голосов
/ 05 мая 2018

Я использую Spark 2.3.0.

В качестве проекта Apache Spark я использую этот набор данных для работы. При попытке прочитать csv с помощью spark строка в кадре данных spark не соответствует правильной строке в файле csv (см. Пример csv здесь ). Код выглядит следующим образом:

answer_df = sparkSession.read.csv('./stacksample/Answers_sample.csv', header=True, inferSchema=True, multiLine=True);
answer_df.show(2)

выход

+--------------------+-------------+--------------------+--------+-----+--------------------+
|                  Id|  OwnerUserId|        CreationDate|ParentId|Score|                Body|
+--------------------+-------------+--------------------+--------+-----+--------------------+
|                  92|           61|2008-08-01T14:45:37Z|      90|   13|"<p><a href=""htt...|
|<p>A very good re...| though.</p>"|                null|    null| null|                null|
+--------------------+-------------+--------------------+--------+-----+--------------------+
only showing top 2 rows

Тем не менее, Когда я использовал панд, это работало как шарм.

df = pd.read_csv('./stacksample/Answers_sample.csv')
df.head(3) 

выход

Index Id    OwnerUserId CreationDate    ParentId    Score   Body
0   92  61  2008-08-01T14:45:37Z    90  13  <p><a href="http://svnbook.red-bean.com/">Vers...
1   124 26  2008-08-01T16:09:47Z    80  12  <p>I wound up using this. It is a kind of a ha...

Мои наблюдения: Apache spark рассматривает каждую строку в CSV-файле как запись для фрейма данных (что разумно), но, с другой стороны, панды разумно (не уверены, на основании каких параметров) выясняют, где на самом деле заканчивается запись.

Вопрос Я хотел бы знать, как я могу дать Spark команду правильно загрузить данные.

Данные для загрузки выглядят следующим образом: строки, начинающиеся с 92 и 124, представляют собой две записи.

Id,OwnerUserId,CreationDate,ParentId,Score,Body
92,61,2008-08-01T14:45:37Z,90,13,"<p><a href=""http://svnbook.red-bean.com/"">Version Control with Subversion</a></p>

<p>A very good resource for source control in general. Not really TortoiseSVN specific, though.</p>"
124,26,2008-08-01T16:09:47Z,80,12,"<p>I wound up using this. It is a kind of a hack, but it actually works pretty well. The only thing is you have to be very careful with your semicolons. : D</p>

<pre><code>var strSql:String = stream.readUTFBytes(stream.bytesAvailable);      
var i:Number = 0;
var strSqlSplit:Array = strSql.split("";"");
for (i = 0; i &lt; strSqlSplit.length; i++){
    NonQuery(strSqlSplit[i].toString());
}
"

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

I думаю вы должны использовать option("escape", "\""), поскольку кажется, что " используется в качестве так называемых кавычек * .

val q = spark.read
  .option("multiLine", true)
  .option("header", true)
  .option("escape", "\"")
  .csv("input.csv")
scala> q.show
+---+-----------+--------------------+--------+-----+--------------------+
| Id|OwnerUserId|        CreationDate|ParentId|Score|                Body|
+---+-----------+--------------------+--------+-----+--------------------+
| 92|         61|2008-08-01T14:45:37Z|      90|   13|<p><a href="http:...|
|124|         26|2008-08-01T16:09:47Z|      80|   12|<p>I wound up usi...|
+---+-----------+--------------------+--------+-----+--------------------+
0 голосов
/ 05 мая 2018

После нескольких часов борьбы я смог найти решение.

Анализ: В дампе данных, предоставленном Stackoverflow, quote(") был экранирован другим quote("). А поскольку spark использует slash(\) в качестве значения по умолчанию для escape-символа, который я не передавал, то в результате он дает бессмысленный вывод.

Обновленный код

answer_df = sparkSession.read.\
    csv('./stacksample/Answers_sample.csv', 
        inferSchema=True, header=True, multiLine=True, escape='"');

answer_df.show(2)

Обратите внимание на использование параметра escape в csv().

выход

+---+-----------+-------------------+--------+-----+--------------------+
| Id|OwnerUserId|       CreationDate|ParentId|Score|                Body|
+---+-----------+-------------------+--------+-----+--------------------+
| 92|         61|2008-08-01 20:15:37|      90|   13|<p><a href="http:...|
|124|         26|2008-08-01 21:39:47|      80|   12|<p>I wound up usi...|
+---+-----------+-------------------+--------+-----+--------------------+

Надеюсь, это поможет другим и сэкономит для них время.

...