2015-09-29 6 views
10

寄木細工する:省はこのように私は、2つのパーティションに基づいてディレクトリ構造を持つサブパーティション

People 
    > surname=Doe 
     > name=John 
     > name=Joe 
    > surname=White 
     > name=Josh 
     > name=Julien 

私は情報のみについてのすべてのんで、寄木細工のファイルを読んでいますので、私は直接指定姓= Doeのだが私のDataFrameの出力ディレクトリとして。今問題は、書き込み時にpartitionBy("name")という名前ベースのパーティショニングを追加しようとしていることです。

df.write.partitionBy("name").parquet(outputDir) 

(outputDirのがDoeのディレクトリへのパスが含まれています)

これは、以下のようなエラーが発生します

Caused by: java.lang.AssertionError: assertion failed: Conflicting partition column names detected: 
    Partition column name list #0: surname, name 
    Partition column name list #1: surname 

それを解決するためにどのように任意のヒントを?おそらく、姓のディレクトリに_SUCCESSというファイルが作成されているため、Sparkに間違ったヒントが与えられている可能性があります。_SUCCESSとファイルを削除しても問題ありません。

答えて

7

私は回避策とそれを解決するために管理している - 私はこれは良いアイデアだとは思わないが、私はして追加_SUCCESSと_metadataファイルを作成する無効:ところでスパークが得られないということ

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false") 
sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false") 

パーティション構造についての愚かなアイデア。

もう1つのオプションは「適切な」ディレクトリに保存することです - 人と姓と姓で区切りますが、念頭におくべきことは、SaveModeからAppendに設定し、上書きされた(これは本当にエラーが発生しやすい):このケースでは。上書きSaveModeを使用しないでください

df.write.mode(SaveMode.Append).partitionBy("surname","name").parquet("/People") 

- これは、姓のdirectoresをすべて削除します。

+0

誰もが他の掲示以来、私の恵みは、有効期限が切れます私はこのソリューションを現在のところ唯一のものとして受け入れています。 – Niemand

+0

これは、Spark 1.6.3 'sc._jsc.hadoopConfiguration()。set(" mapreduce.fileoutputcommitter.marksuccessfuljobs "、" false ")のために私のために働いた sc._jsc.hadoopConfiguration()。set(" parquet.enable.summary -metadata "、" false ")' – Vezir

2
sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false") 

あなたは、メタデータファイルを書き込み、その後有効に要約メタデータを持っている場合は読み込みと書き込みのIOボトルネックになることができ、かなり賢明です。

あなたのソリューションに代わる方法はなく、送信先として、元の親ディレクトリと、自分の書き込みに(「追加」).modeを追加するかもしれない、

df.write.mode("append").partitionBy("name").parquet("/People") 
+0

appendの問題は、手動でデータを削除する必要があり、私の場合は面倒です。 – Niemand

+0

真実ですが、Sparkでファイルパーティションを削除するのは、とにかく基本的には初心者です... –

関連する問題