MungingData

denne bloggen forklarer hvordan du skriver Ut En DataFrame til En enkelt fil med Spark. Det beskriver også hvordan du skriver ut data i en fil med et bestemt navn, noe som er overraskende utfordrende.

Å Skrive ut en enkelt fil med Spark er ikke typisk. Spark er designet for å skrive ut flere filer parallelt. Skrive ut mange filer samtidig er raskere for store datasett.

Standard oppførsel

la oss opprette En DataFrame, bruk repartition(3) til å opprette tre minnepartisjoner, og skriv deretter ut filen til disken.

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

her er filene som genereres på disken.

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

Spark skriver ut en fil per minnepartisjon. Vi brukte repartition(3) for å lage tre minnepartisjoner, så tre filer ble skrevet.

Skrive ut en fil med partisjonering

vi kan bruke repartition(1) skrive ut en enkelt fil.

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

her er filen som er skrevet til disk.

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

vi kan ikke kontrollere navnet på filen som er skrevet. Vi kan kontrollere navnet på katalogen, men ikke selve filen.

denne løsningen er ikke tilstrekkelig når du vil skrive data til en fil med et bestemt navn.

Skrive ut en enkelt fil med coalesce

Vi kan også bruke coalesce(1) for å skrive ut en enkelt fil.

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

her er hva som sendes ut.

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

coalesce lar oss heller ikke angi et bestemt filnavn (det lar oss bare tilpasse mappenavnet). Vi må bruke spark-daria for å få tilgang til en metode som vil sende ut en enkelt fil.

Skrive ut en fil med et bestemt navn

du kan bruke funksjonen DariaWriters.writeSingleFile definert i spark-daria til å skrive ut en enkelt fil med et bestemt filnavn.

her er koden som skriver ut innholdet i En DataFrame til ~/Documents/better/mydata.csv – filen.

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")

metoden writeSingleFile lar deg navngi filen uten å bekymre deg for kompliserte implementeringsdetaljer.

writeSingleFile is bruker repartition(1) Og Hadoop filsystem metoder under panseret. Alle Hadoop filsystem metoder er tilgjengelige i Alle Spark runtime miljø – du trenger ikke å feste noen separate Krukker.

Kompatibilitet med andre filsystemer

Det er best å bruke Hadoop-filsystemmetodene når du flytter, omdøper eller sletter filer, slik at koden din vil fungere på flere plattformer. writeSingleFile fungerer på ditt lokale filsystem og I S3. Du kan bruke denne tilnærmingen når du kjører Spark lokalt eller I En Databricks notatblokk.

det finnes andre løsninger på dette problemet som ikke er kryssplattform. Det finnes løsninger som bare fungerer I Databricks notatbøker, eller bare fungerer I S3, eller bare fungerer På Et Unix-lignende operativsystem.

Hadoop-filsystemmetodene er klumpete å jobbe med, men det beste alternativet fordi de jobber på flere plattformer.

writeSingleFile – metoden bruker fs.rename() Hadoop-metoden, som beskrevet i dette svaret. Her er psuedokoden:

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)

copyMerge

Hadoop 2 har en FileUtil.copyMerge() metode som er en elegant løsning på dette problemet, men denne metoden er utdatert og vil bli fjernet I Hadoop 3. Det er et svar i denne tråden som reimplements copyMerge For Hadoop 3 brukere.

skriv I alle fall ikke kode som er avhengig av FileUtil.copyMerge() – metoden. Vi vet at metoden vil være utilgjengelig når Spark oppgraderinger Til Hadoop 3 og du ikke ønsker å stole på en utdatert metode som vil bryte på et ukjent tidspunkt i fremtiden.

Neste trinn

du vil vanligvis skrive ut flere filer parallelt, men i sjeldne tilfeller når du vil skrive ut en enkelt fil, vil spark-daria writeSingleFile – metoden hjelpe.

Prøv ditt beste for å pakke den komplekse Hadoop filsystemlogikken i hjelpemetoder som testes separert. Kombinere Hadoop filsystem operasjoner og Spark kode i samme metode vil gjøre koden for komplisert.

You might also like

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.