मेरे पास एक डेटाफ्रेम है जिसमें एक पंक्ति है, और कई कॉलम हैं। कुछ कॉलम एकल मान हैं, और अन्य सूचियां हैं। सभी सूची कॉलम एक ही लंबाई हैं। मैं प्रत्येक सूची कॉलम को एक अलग पंक्ति में विभाजित करना चाहता हूं, जबकि किसी भी गैर-सूची कॉलम को रखना है।Pyspark: कई एरे कॉलम पंक्तियों में विभाजित करें
नमूना DF:
df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])
# +---+---------+---------+---+
# | a| b| c| d|
# +---+---------+---------+---+
# | 1|[1, 2, 3]|[7, 8, 9]|foo|
# +---+---------+---------+---+
मुझे क्या करना चाहते हैं:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
अगर मैं केवल एक सूची स्तंभ, यह सिर्फ एक explode
करके आसान होगा था:
df_exploded = df.withColumn('b', explode('b'))
# >>> df_exploded.show()
# +---+---+---------+---+
# | a| b| c| d|
# +---+---+---------+---+
# | 1| 1|[7, 8, 9]|foo|
# | 1| 2|[7, 8, 9]|foo|
# | 1| 3|[7, 8, 9]|foo|
# +---+---+---------+---+
हालांकि, अगर मैं explode
c
कॉलम भी करने का प्रयास करता हूं, तो मैं डेटाफ के साथ समाप्त होता हूं लंबाई के साथ टहनी जो मैं चाहता के वर्ग:
df_exploded_again = df_exploded.withColumn('c', explode('c'))
# >>> df_exploded_again.show()
# +---+---+---+---+
# | a| b| c| d|
# +---+---+---+---+
# | 1| 1| 7|foo|
# | 1| 1| 8|foo|
# | 1| 1| 9|foo|
# | 1| 2| 7|foo|
# | 1| 2| 8|foo|
# | 1| 2| 9|foo|
# | 1| 3| 7|foo|
# | 1| 3| 8|foo|
# | 1| 3| 9|foo|
# +---+---+---+---+
मैं क्या चाहते है - प्रत्येक स्तंभ के लिए, उस कॉलम में सरणी के n वें तत्व लेने के लिए और एक नई पंक्ति है कि जोड़ें। मैं एक dataframe में सभी स्तंभों करवाते विस्फोट मानचित्रण की कोशिश की है, लेकिन यह काम करने के लिए या तो प्रतीत नहीं होता:
df_split = df.rdd.map(lambda col: df.withColumn(col, explode(col))).toDF()