2015-09-29 11 views
10

Mam strukturę katalogów oparte na dwóch partycjach, tak:Oszczędzanie na parkiet podpartycję

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

Czytam plików parkietem informacje tylko o wszystko robi, i dlatego jestem bezpośrednio określające nazwisko = Kowalski jako katalog wyjściowy dla mojej DataFrame. Problem polega na tym, że próbuję dodać partycjonowanie oparte na nazwach przy pisaniu partitionBy("name").

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

(outputDir zawiera ścieżkę do katalogu DOE)

Powoduje to błąd jak poniżej:

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 

jakieś wskazówki jak go rozwiązać? Prawdopodobnie dzieje się tak z powodu pliku _SUCCESS utworzonego w katalogu nazwisk, który podaje złe wskazówki dla Sparka - kiedy usuwam pliki _SUCCESS i _metadata, Spark może czytać wszystko bez żadnego problemu.

Odpowiedz

7

udało mi się go rozwiązać z obejścia - Nie sądzę, że to dobry pomysł, ale wyłączone tworzenia dodatkowych _SUCCESS i plików _metadata z:

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

tamtędy Spark nie dostanie wszelkie głupie pomysły na temat struktur partycjonujących.

Inną opcją jest zapisanie do "właściwego" katalogu - Ludzie i partycja po nazwisku i nazwisku, ale musisz pamiętać, że jedyną rozsądną opcją jest ustawienie SaveMode na Append i ręczne usunięcie katalogów, które oczekujesz nadpisane (to naprawdę podatne na błędy):

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

nie używaj owerwrite SaveMode w tym przypadku - to będzie usunąć wszystkie directores nazwisko.

+0

Ponieważ nikt inny pisał i wygasa moja laska , Akceptuję to rozwiązanie jako jedyne znane na razie. – Niemand

+0

To działało dla mnie dla 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") 

jest dość rozsądne, jeśli masz włączony następnie podsumowanie metadane zapisu pliku metadanych może stać się wąskim gardłem IO na odczyt i zapis.

Alternatywna droga do rozwiązania może być dodanie .mode („dołączyć”) do zapisu, ale z oryginalnego katalogu nadrzędnego jako miejsca przeznaczenia,

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

Problem z dodatkiem to, że musiałbym ręcznie usunąć dane, co będzie uciążliwe w moim przypadku. – Niemand

+0

To prawda, ale usunięcie partycji plików w Sparku jest w najlepszym wypadku szczątkowe ... –

Powiązane problemy