मेरे पास कई कुंजी/मूल्य जोड़े के डेटा/पंक्तियां अज्ञात संख्या में चाबियों के साथ हैं - कुछ ओवरलैपिंग और कुछ नहीं - कि मैं स्पार्क डेटाफ्रेम बनाना चाहता हूं। मेरा अंतिम लक्ष्य इस डेटाफ़्रेम से सीएसवी लिखना है।

मेरे पास इनपुट डेटा/पंक्तियों के साथ लचीलापन है: सबसे आसानी से वे 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
------------------------------------

एक बार जब प्राथमिक प्रश्न के लिए एक दृष्टिकोण हो जाता है, तो मुझे विश्वास है कि मैं इस भाग पर काम कर सकता हूं, लेकिन इसे किसी भी तरह से बाहर फेंक देना क्योंकि यह समस्या का एक आयाम होगा।

2
ghukill 29 नवम्बर 2018, 17:35

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|
#+------------+-------------+----------+
2
pault 29 नवम्बर 2018, 16:40