2017-12-15 15 views
2

私は2つのcsvファイルを持っています.1つは映画のためのキーワードを含み、もう1つはキャストとクルーを含みます。 keywords.csvファイルには、次のようになります。スパークをひどく誤ってcsvを誤って修正する方法はありますか?

$ head -n 3 keywords.csv 
id,keywords 
862,"[{'id': 931, 'name': 'jealousy'}, {'id': 4290, 'name': 'toy'}, {'id': 5202, 'name': 'boy'}, {'id': 6054, 'name': 'friendship'}, {'id': 9713, 'name': 'friends'}, {'id': 9823, 'name': 'rivalry'}, {'id': 165503, 'name': 'boy next door'}, {'id': 170722, 'name': 'new toy'}, {'id': 187065, 'name': 'toy comes to life'}]" 
8844,"[{'id': 10090, 'name': 'board game'}, {'id': 10941, 'name': 'disappearance'}, {'id': 15101, 'name': ""based on children's book""}, {'id': 33467, 'name': 'new home'}, {'id': 158086, 'name': 'recluse'}, {'id': 158091, 'name': 'giant insect'}]" 

credits.csvファイルには、次のようになります。

はどちらが適切 pandasは何の問題を持っていないCSVを形成している
$ head -n 2 credits.csv 
cast,crew,id 
"[{'cast_id': 14, 'character': 'Woody (voice)', 'credit_id': '52fe4284c3a36847f8024f95', 'gender': 2, 'id': 31, 'name': 'Tom Hanks', 'order': 0, 'profile_path': '/pQFoyx7rp09CJTAb932F2g8Nlho.jpg'}, {'cast_id': 15, 'character': 'Buzz Lightyear (voice)', 'credit_id': '52fe4284c3a36847f8024f99', 'gender': 2, 'id': 12898, 'name': 'Tim Allen', 'order': 1, 'profile_path': '/uX2xVf6pMmPepxnvFWyBtjexzgY.jpg'}]", 1 

に読んスパークは、このようにそれらを読み取ります

spark.read 
    .option("quote", "\"") 
    .option("delimiter", ",") 
    .option("header", "true") 
    .csv("keywords.csv") 
    .show(2) 

出力:

+-------+--------------------+ 
|movieId|   keywords| 
+-------+--------------------+ 
| 862|[{'id': 931, 'nam...| 
| 8844|"[{'id': 10090, '...| 
+-------+--------------------+ 

明らかに第1行目と第2行目の矛盾があります("文字の有無に注意してください)。これは、文字列置換を含む単純なudfで修正できます。

credits.csvにとってはしかし恐ろしくうまくいかない:

spark.read 
    .option("quote", "\"") 
    .option("delimiter", ",") 
    .option("header", "true") 
    .csv("credits.csv") 
    .show(2) 

出力:(可能であれば)

+--------------------+--------------------+--------------------+ 
|    cast|    crew|    movieId| 
+--------------------+--------------------+--------------------+ 
|[{'cast_id': 14, ...|"[{'credit_id': '...| 'profile_path': ...| 
|[{'cast_id': 1, '...|[{'credit_id': '5...|    8844| 
+--------------------+--------------------+--------------------+ 

列が壊れている...

は、どのように私は適切にこれを読むことができます列を壊すことなく?私は驚いてpandasには問題はありませんが、スパークは悲惨に失敗します。あなたは間違ったエスケープ文字を使用する最初のファイルの場合

+1

「creditits.csv」のサンプルは、額面で引用文字を使用すると仮定すると、2つのフィールドしかありません。 2つの辞書を含むリストのように見える最初のフィールド文字列。 2番目のフィールドは整数です。 –

答えて

3

- デフォルト1 csvでは\であり、あなたのファイルが"使用しています。数秒のファイルで

>>> (spark.read 
... .option("escape", '"') 
... .option("header", "true") 
... .csv("keywords.csv") 
... .show(2)) 
... 
+----+--------------------+ 
| id|   keywords| 
+----+--------------------+ 
| 862|[{'id': 931, 'nam...| 
|8844|[{'id': 10090, 'n...| 
+----+--------------------+ 

は(credits.csv)は同じ問題があり、さらにヘッダー内のフィールドには、それが正しくスパークにロードすることはできません(Kirk Broadhurstによってcomment)のデータと一致していません:

>>> (spark.read 
... .option("escape", '"') 
... .option("header", "true") 
... .csv("credits.csv") 
... .show(2)) 
... 
+--------------------+----+----+ 
|    cast|crew| id| 
+--------------------+----+----+ 
|[{'cast_id': 14, ...| 1|null| 
+--------------------+----+----+ 

とPAND

>>> pd.read_csv("credits.csv") 
               cast crew id 
0 [{'cast_id': 14, 'character': 'Woody (voice)',...  1 NaN 
関連する問題