MungingData

ez a blog elmagyarázza, hogyan kell írni egy DataFrame egyetlen fájlba Spark. Azt is leírja, hogyan lehet adatokat írni egy adott névvel rendelkező fájlba, ami meglepően kihívást jelent.

egyetlen fájl Spark-val történő kiírása nem jellemző. A Spark célja több fájl párhuzamos kiírása. Sok fájl egyidejű kiírása gyorsabb a nagy adatkészleteknél.

alapértelmezett viselkedés

hozzunk létre egy Adatkeretet, a repartition(3) használatával hozzunk létre három memóriapartíciót, majd írjuk ki a fájlt a lemezre.

val df = Seq("one", "two", "three").toDF("num")df .repartition(3) .write.csv(sys.env("HOME")+ "/Documents/tmp/some-files")

itt vannak a lemezen generált fájlok.

Documents/ tmp/ some-files/ _SUCCESS part-00000-b69460e8-fdc3-4593-bab4-bd15fa0dad98-c000.csv part-00001-b69460e8-fdc3-4593-bab4-bd15fa0dad98-c000.csv part-00002-b69460e8-fdc3-4593-bab4-bd15fa0dad98-c000.csv

A Spark memória partíciónként egy fájlt ír ki. A repartition(3) – et három memóriapartíció létrehozásához használtuk, így három fájlt írtunk.

egy fájl kiírása

felosztással használhatjuk a repartition(1) egyetlen fájlt.

df .repartition(1) .write.csv(sys.env("HOME")+ "/Documents/tmp/one-file-repartition")

itt van a lemezre írt fájl.

Documents/ tmp/ one-file-repartition/ _SUCCESS part-00000-d5a15f40-e787-4fd2-b8eb-c810d973b6fe-c000.csv

nem tudjuk ellenőrizni az írott fájl nevét. Szabályozhatjuk a könyvtár nevét, de magát a fájlt nem.

ez a megoldás nem elegendő, ha egy adott nevű fájlba szeretne adatokat írni.

egyetlen fájl kiírása a coalesce

segítségével a coalesce(1) fájlt is írhatjuk.

df .coalesce(1) .write.csv(sys.env("HOME")+ "/Documents/tmp/one-file-coalesce")

itt van, mi outputted.

Documents/ tmp/ one-file-coalesce/ _SUCCESS part-00000-c7521799-e6d8-498d-b857-2aba7f56533a-c000.csv

a coalesce sem engedi, hogy egy adott fájlnevet állítsunk be (csak a mappa nevét szabjuk testre). A spark-daria-t kell használnunk egy olyan módszer eléréséhez, amely egyetlen fájlt ad ki.

meghatározott nevű fájl kiírása

A spark-daria-ban meghatározott DariaWriters.writeSingleFile függvény segítségével egyetlen fájlt írhat ki egy adott fájlnévvel.

itt van a kód, amely kiírja az adatkeret tartalmát a ~/Documents/better/mydata.csv fájlba.

import com.github.mrpowers.spark.daria.sql.DariaWritersDariaWriters.writeSingleFile( df = df, format = "csv", sc = spark.sparkContext, tmpFolder = sys.env("HOME") + "/Documents/better/tmp", filename = sys.env("HOME") + "/Documents/better/mydata.csv")

a writeSingleFile metódus nevezze el a fájlt anélkül, hogy aggódna a bonyolult megvalósítási részletek miatt.

writeSingleFile is használ repartition(1) és Hadoop fájlrendszer módszerek alatt a motorháztető. Az összes Hadoop fájlrendszer módszerek állnak rendelkezésre minden Spark runtime környezetben – nem kell csatolni külön Üvegek.

kompatibilitás más fájlrendszerekkel

a legjobb, ha a Hadoop fájlrendszer módszereket használja fájlok áthelyezésekor, átnevezésekor vagy törlésekor, így a kód több platformon fog működni. writeSingleFile működik a helyi fájlrendszeren és az S3-ban. Ezt a megközelítést akkor használhatja, ha a Sparkot helyben vagy Databricks jegyzetfüzetben futtatja.

vannak más megoldások erre a problémára, amelyek nem cross platform. Vannak olyan megoldások, amelyek csak a Databricks notebookokban működnek, vagy csak az S3-ban működnek, vagy csak Unix-szerű operációs rendszeren működnek.

a Hadoop fájlrendszer módszerek ügyetlen dolgozni, de a legjobb megoldás, mert a munka több platformon.

a writeSingleFile módszer a fs.rename() Hadoop módszert használja, a válaszban leírtak szerint. Itt van a psuedocode:

val src = new Path("s3a://bucket/data/src")val dest = new Path("s3a://bucket/data/dest")val conf = sc.hadoopConfiguration // assuming sc = spark contextval fs = src.getFileSystem(conf)fs.rename(src, dest)

a copyMerge

Hadoop 2 rendelkezik egy FileUtil.copyMerge() módszerrel, amely elegáns megoldás erre a problémára, de ez a módszer elavult, és eltávolításra kerül a Hadoop 3-ban. Ebben a szálban van egy válasz, amely copyMerge – et újraimplementál a Hadoop 3 felhasználók számára.

mindenesetre ne írjon olyan kódot, amely a FileUtil.copyMerge() módszerre támaszkodik. Tudjuk, hogy a módszer elérhetetlen lesz, amikor a Spark frissíti a Hadoop 3-at, és nem akarja támaszkodni egy elavult módszerre, amely a jövőben ismeretlen időpontban megszakad.

következő lépések

általában több fájlt szeretne kiírni párhuzamosan, de ritka esetekben, amikor egyetlen fájlt szeretne kiírni, a spark-daria writeSingleFile módszer segít.

próbálja meg a legjobb, hogy lezárja a komplex Hadoop fájlrendszer logika segítő módszerek, amelyek tesztelik elválasztva. A Hadoop fájlrendszer műveletek és a Spark kód kombinálása ugyanabban a módszerben túl összetetté teszi a kódot.

You might also like

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.