मेरे पास कई कुंजी/मूल्य जोड़े के डेटा/पंक्तियां अज्ञात संख्या में चाबियों के साथ हैं - कुछ ओवरलैपिंग और कुछ नहीं - कि मैं स्पार्क डेटाफ्रेम बनाना चाहता हूं। मेरा अंतिम लक्ष्य इस डेटाफ़्रेम से सीएसवी लिखना है।
मेरे पास इनपुट डेटा/पंक्तियों के साथ लचीलापन है: सबसे आसानी से वे JSON स्ट्रिंग्स हैं, लेकिन परिवर्तित किया जा सकता है, संभावित रूप से ओवरलैपिंग कुंजियों द्वारा भिन्न होता है:
{"color":"red", "animal":"fish"}
{"color":"green", "animal":"panda"}
{"color":"red", "animal":"panda", "fruit":"watermelon"}
{"animal":"aardvark"}
{"color":"blue", "fruit":"apple"}
आदर्श रूप से, मैं एक डेटाफ़्रेम बनाना चाहूंगा जो इस डेटा से इस तरह दिखता है:
-----------------------------
color | animal | fruit
-----------------------------
red | fish | null
green | panda | null
red | panda | watermelon
null | aardvark | null
blue | null | apple
-----------------------------
ध्यान दें, बिना किसी विशेष कुंजी के डेटा/पंक्तियां null
हैं, और डेटा/पंक्तियों की सभी कुंजियों को कॉलम के रूप में दर्शाया जाता है।
मैं कई स्पार्क मूल बातों के साथ अपेक्षाकृत सहज महसूस करता हूं, लेकिन कुंजी/मूल्य जोड़े के साथ अपने आरडीडी/डेटाफ्रेम को कुशलतापूर्वक लेने के लिए एक प्रक्रिया की कल्पना करने में परेशानी हो रही है - लेकिन अज्ञात संख्या में कॉलम और कुंजी - और कॉलम के रूप में उन चाबियों के साथ डेटाफ्रेम बनाना।
कुशल, यदि संभव हो तो, मैं एक ऐसी वस्तु बनाने से बचना चाहता हूं जहां सभी इनपुट पंक्तियां स्मृति में हों (उदा। एक शब्दकोश)।
फिर से, सीएसवी लिखने का अंतिम लक्ष्य, जहां मैं डेटाफ्रेम बनाने का अनुमान लगा रहा हूं, उस अंत तक एक तार्किक कदम है।
एक और शिकन:
कुछ डेटा बहुमूल्यवान होंगे, कुछ इस तरह:
{"color":"pink", "animal":["fish","mustang"]}
{"color":["orange","purple"], "animal":"panda"}
दिए गए डिलीमीटर के साथ, उदा. /
कॉलम के परिसीमन के लिए ,
के साथ टकराव से बचने के लिए, मैं कॉलम के आउटपुट में इनका परिसीमन करना चाहूंगा, जैसे:
------------------------------------
color | animal | fruit
------------------------------------
pink | fish/mustang | null
orange/purple | panda | null
------------------------------------
एक बार जब प्राथमिक प्रश्न के लिए एक दृष्टिकोण हो जाता है, तो मुझे विश्वास है कि मैं इस भाग पर काम कर सकता हूं, लेकिन इसे किसी भी तरह से बाहर फेंक देना क्योंकि यह समस्या का एक आयाम होगा।
1 उत्तर
फ़ाइल से पढ़ना
यदि आपका डेटा किसी फ़ाइल में संग्रहीत किया गया था (मान लीजिए कि इसे myfile.json
नाम दिया गया था) निम्न की तरह:
{"color":"red", "animal":"fish"}
{"color":"green", "animal":"panda"}
{"color":"red", "animal":"panda", "fruit":"watermelon"}
{"animal":"aardvark"}
{"color":"blue", "fruit":"apple"}
{"color":"pink", "animal":["fish","mustang"]}
{"color":["orange","purple"], "animal":"panda"}
आप उपयोग कर सकते हैं pyspark.sql.DataFrameReader.json
फ़ाइल को न्यूलाइन-सीमांकित JSON रिकॉर्ड के रूप में पढ़ने के लिए।
df = spark.read.json("myfile.json")
df.show()
#+------------------+-------------------+----------+
#| animal| color| fruit|
#+------------------+-------------------+----------+
#| fish| red| null|
#| panda| green| null|
#| panda| red|watermelon|
#| aardvark| null| null|
#| null| blue| apple|
#|["fish","mustang"]| pink| null|
#| panda|["orange","purple"]| null|
#+------------------+-------------------+----------+
df.printSchema()
#root
# |-- animal: string (nullable = true)
# |-- color: string (nullable = true)
# |-- fruit: string (nullable = true)
आरडीडी से पढ़ें
आप rdd
से पढ़ने के लिए भी ऐसा ही कर सकते हैं:
import json
rdd = sc.parallelize(
map(
json.dumps,
[
{"color":"red", "animal":"fish"},
{"color":"green", "animal":"panda"},
{"color":"red", "animal":"panda", "fruit":"watermelon"},
{"animal":"aardvark"},
{"color":"blue", "fruit":"apple"},
{"color":"pink", "animal":["fish","mustang"]},
{"color":["orange","purple"], "animal":"panda"}
]
)
)
df = spark.read.json(rdd)
दूसरे भाग के लिए, आप pyspark.sql.functions.regexp_replace
का उपयोग अपने बहु-मूल्यवान रिकॉर्ड को इच्छानुसार प्रारूपित करने के लिए कर सकते हैं।
from pyspark.sql.functions import regexp_replace
def format_column(column):
return regexp_replace(regexp_replace(column, '(^\[)|(\]$)|(")', ''), ",", "/")
df.select(*[format_column(c).alias(c) for c in df.columns]).show()
#+------------+-------------+----------+
#| animal| color| fruit|
#+------------+-------------+----------+
#| fish| red| null|
#| panda| green| null|
#| panda| red|watermelon|
#| aardvark| null| null|
#| null| blue| apple|
#|fish/mustang| pink| null|
#| panda|orange/purple| null|
#+------------+-------------+----------+
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।