यह उत्तर स्वीकृत उत्तर पर फैलता है, अधिक संदर्भ देता है, और कोड स्निपेट प्रदान करता है जिसे आप अपनी मशीन पर स्पार्क शेल में चला सकते हैं।
स्वीकृत उत्तर पर अधिक संदर्भ
स्वीकृत उत्तर आपको यह आभास दे सकता है कि नमूना कोड एकल mydata.csv
फ़ाइल को आउटपुट करता है और ऐसी स्थिति नहीं है। आइए प्रदर्शित करें:
val df = Seq("one", "two", "three").toDF("num")
df
.repartition(1)
.write.csv(sys.env("HOME")+ "/Documents/tmp/mydata.csv")
यहाँ क्या उत्पादन किया गया है:
Documents/
tmp/
mydata.csv/
_SUCCESS
part-00000-b3700504-e58b-4552-880b-e7b52c60157e-c000.csv
NB mydata.csv
स्वीकृत उत्तर में एक फ़ोल्डर है - यह एक फ़ाइल नहीं है!
किसी विशिष्ट नाम के साथ किसी एकल फ़ाइल को कैसे आउटपुट करें
हम सिंगल फाइल लिखने के लिए स्पार्क-डारिया का उपयोग कर सकते हैं mydata.csv
।
import com.github.mrpowers.spark.daria.sql.DariaWriters
DariaWriters.writeSingleFile(
df = df,
format = "csv",
sc = spark.sparkContext,
tmpFolder = sys.env("HOME") + "/Documents/better/staging",
filename = sys.env("HOME") + "/Documents/better/mydata.csv"
)
यह फाइल को निम्नानुसार आउटपुट करेगा:
Documents/
better/
mydata.csv
S3 पथ
आपको DariaWriters.writeSingleFile
S3 में इस विधि का उपयोग करने के लिए s3a पथ को पास करना होगा :
DariaWriters.writeSingleFile(
df = df,
format = "csv",
sc = spark.sparkContext,
tmpFolder = "s3a://bucket/data/src",
filename = "s3a://bucket/data/dest/my_cool_file.csv"
)
अधिक जानकारी के लिए यहां देखें ।
नकल से बचना
copyMerge Hadoop 3. हटा दिया गया था DariaWriters.writeSingleFile
कार्यान्वयन का उपयोग करता है fs.rename
, के रूप में यहाँ वर्णित । स्पार्क 3 अभी भी Hadoop 2 का उपयोग करता है , इसलिए copyMerge कार्यान्वयन 2020 में काम करेगा। मुझे यकीन नहीं है कि जब स्पार्क Hadoop 3 में अपग्रेड होगा, लेकिन किसी भी copyMerge के दृष्टिकोण से बचने के लिए बेहतर है कि स्पार्क अपग्रेड किए जाने पर आपका कोड टूट जाएगा।
सोर्स कोड
के लिए देखो DariaWriters
चिंगारी दारिया स्रोत कोड में वस्तु यदि आप कार्यान्वयन का निरीक्षण करना चाहते हैं।
PySpark कार्यान्वयन
पाइस्पार्क के साथ एक एकल फ़ाइल को लिखना आसान है क्योंकि आप डेटाफ़्रेम को पांडस डेटाफ़्रेम में बदल सकते हैं जो डिफ़ॉल्ट रूप से एकल फ़ाइल के रूप में लिखा जाता है।
from pathlib import Path
home = str(Path.home())
data = [
("jellyfish", "JALYF"),
("li", "L"),
("luisa", "LAS"),
(None, None)
]
df = spark.createDataFrame(data, ["word", "expected"])
df.toPandas().to_csv(home + "/Documents/tmp/mydata-from-pyspark.csv", sep=',', header=True, index=False)
सीमाएं
DariaWriters.writeSingleFile
स्काला दृष्टिकोण और df.toPandas()
अजगर छोटे डेटासेट के लिए केवल काम दृष्टिकोण। विशाल डेटासेट को एकल फ़ाइलों के रूप में नहीं लिखा जा सकता है। डेटा को एकल फ़ाइल के रूप में लिखना प्रदर्शन के दृष्टिकोण से इष्टतम नहीं है क्योंकि डेटा को समानांतर में नहीं लिखा जा सकता है।