Problem
Jeśli chce zapisać DataFrame jako plik na HDFS to może się pojawić problem, że zostanie on zapisany w postaci wielu plików. Jest to jak najbardziej poprawne zachowanie i wynika to ze zrównoleglania pracy w Apache Spark. Jednak jeśli chcemy wymusić zapis do jednego pliku należy zmienić partycjonowanie DataFrame do jednej partycji. W tym celu należy przed zapisem wywołać metodę “coalesce” i podać ilość partycji.
Rozwiązanie
Poniższy przykład przedstawia w jaki sposób zapisać dowolny DataFrame to pliku CSV. Dodatkowo przedstawiłem kilka dostępnych opcji tj.:
- Mode – dostępne opcje:
- overwrite – zawsze nadpisuje plik
- append – dodaj do istniejącego pliku jeśli istnieje
- igonre – zignoruj jeśli istnieje
- error, errorIfExists, default – niech powstanie błąd jeśli plik istnieje. (opcja domyślna).
- header – czy na początku pliku ma być nagłówek
- delimiter – separator kolumn w pliku
- quoteMode – jeśli ustawimy na “true” to każda kolumna będzie zapisana pomiędzy cudzysłowie.
quoteMode = true | “Spark”,”is”,”Cool” |
quoteMode = false | Spark,is,Cool |
myDataFrame.coalesce(1).write.format("com.databricks.spark.csv") .mode("overwrite") .option("header", "true") .option("delimiter", ",") .option("quoteMode", "true") .save("<output_hdfs_path>")