2016-03-22 6 views
10

ja partycjonowanie DataFrame następująco:Prevent DataFrame.partitionBy() od usuwania kolumn podzielonych na partycje od schematu

df.write.partitionBy("type", "category").parquet(config.outpath) 

Kod daje oczekiwanych rezultatów (czyli danych podzielono według rodzaju & kategorii). Jednak kolumny "typ" i "kategoria" są usuwane z danych/schematu. Czy istnieje sposób, aby temu zapobiec?

+0

Czy to nie jest punkt? Wszystkie wymagane dane są nadal zakodowane w strukturze katalogów, więc nie ma utraty danych. Jeśli chcesz mieć jakieś wartości na plik, możesz wypróbować 'df.repartition (" type "," category "). Napisz (...)' ale nie uzyskasz ładnej struktury. – zero323

+0

@ zero323: tak, zgadzam się, że nie ma utraty danych. Jednak odzyskiwanie kolumn używanych do partycjonowania nie jest trywialne w niektórych przypadkach użycia. Na przykład, jeśli chcę załadować dane w świni, w jaki sposób odzyskać kolumny typu i kategorii? – Michael

+0

Nie używam świni przez jakiś czas. Czy "ParquetLoader" nie rozumie struktury z pudełka? – zero323

Odpowiedz

8

Mogę wymyślić jedno obejście, które jest raczej kulawy, ale działa.

import spark.implicits._ 

val duplicated = df.withColumn("_type", $"type").withColumn("_category", $"category") 
duplicated.write.partitionBy("_type", "_category").parquet(config.outpath) 

mam odpowiedzi na to pytanie w nadziei, że ktoś może mieć lepszą odpowiedź lub wyjaśnienia niż to, co mam (jeśli PO znalazła lepsze rozwiązanie), chociaż, ponieważ mam to samo pytanie.

+1

Właściwie nie wydaje mi się to ułomne. Wydaje się najlepszym podejściem, biorąc pod uwagę zachowanie 'partitionBy()'. – Michael

1

Ogólnie rzecz biorąc, odpowiedź Ivana jest drobnym cludge. ALE ...

Jeśli ściśle czytasz i piszesz w iskrze, możesz po prostu użyć opcji basePath podczas czytania twoich danych.

https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#partition-discovery

Przechodząc ka/do/tabela albo SparkSession.read.parquet lub SparkSession.read.load, iskra SQL automatycznie wyodrębnić informację partycji od ścieżki.

Przykład:

 val dataset = spark 
     .read 
     .format("parquet") 
     .option("basePath", hdfsInputBasePath) 
     .load(hdfsInputPath) 
Powiązane problemy