मैं इस समस्या से काफी समय से अटका हुआ हूं और शायद इसे वास्तव में जितना बड़ा है उससे बड़ा बना रहा हूं। मैं इसे सरल बनाने की कोशिश करूंगा।

मैं अपने कोड के साथ pyspark और डेटा फ्रेम फ़ंक्शंस का उपयोग कर रहा हूं।

मेरे पास पहले से ही एक df है:

+--+-----+---------+
|id|col1 |col2     |
+--+-----+---------+
|1 |Hello|Repeat   |
|2 |Word |Repeat   |
|3 |Aux  |No repeat|
|4 |Test |Repeat   |
+--+-----+---------+

मैं जो हासिल करना चाहता हूं वह डीएफ की पंक्तियों को दोहराना है जब col2 'दोहराएं' मान + 1 में col1 के मानों को बढ़ा रहा है।

+--+-----+---------+------+
|id|col1 |col2     |col3  |
+--+-----+---------+------+
|1 |Hello|Repeat   |Hello1|
|1 |Hello|Repeat   |Hello2|
|1 |Hello|Repeat   |Hello3|
|2 |Word |Repeat   |Word1 |
|2 |Word |Repeat   |Word2 |
|2 |Word |Repeat   |Word3 |
|3 |Aux  |No repeat|Aux   |
|4 |Test |Repeat   |Test1 |
|4 |Test |Repeat   |Test2 |
|4 |Test |Repeat   |Test3 |
+--+-----+---------+------+

मेरा पहला तरीका udf की मदद से एक नया कॉलम बनाने के लिए withColumn ऑपरेटर का उपयोग करना था:

my_func = udf(lambda words: (words + str(i + 1 for i in range(3))), StringType())
df = df\
    .withColumn('col3', when(col('col2') == 'No Repeat', col('col1'))
                            .otherwise(my_func(col('col1'))))

लेकिन जब मैं इसका मूल्यांकन df.show(10,False) में करता हूं तो यह मुझे एक त्रुटि देता है। मेरा अनुमान इसलिए है क्योंकि मैं इस तरह से withColumn फ़ंक्शन के साथ और अधिक पंक्तियां नहीं बना सकता।

इसलिए मैं बिना किसी सफलता के दूसरे दृष्टिकोण के लिए जाने का फैसला करता हूं। rdd.flatMap का उपयोग करना:

test = df.rdd.flatMap(lambda row: (row if (row.col2== 'No Repeat') else (row.col1 + str(i+1) for i in range(3))))
print(test.collect())

लेकिन यहां मैं df स्कीमा खो रहा हूं और मैं पूरी पंक्ति को अन्य शर्त पर नहीं फेंक सकता, यह मुझे केवल col1 शब्द और इसके पुनरावर्तक को फेंक देता है

क्या आप इसे हल करने का कोई उचित तरीका जानते हैं?

अंत में मेरी समस्या यह है कि मुझे कॉलम मानों के आधार पर अधिक पंक्तियां बनाने का उचित तरीका नहीं मिलता है क्योंकि मैं इस दुनिया में काफी नया हूं। यह भी उत्तर देता है कि मैंने पाया कि इस समस्या के अनुरूप नहीं है।

सभी मदद की सराहना की जाएगी।

1
Als 16 अप्रैल 2020, 13:32

1 उत्तर

सबसे बढ़िया उत्तर

एक तरीका एक शर्त का उपयोग करना है और एक सरणी असाइन करना है, फिर विस्फोट करना है,

import pyspark.sql.functions as F

(df.withColumn("test",F.when(df['col2']=='Repeat',
       F.array([F.lit(str(i)) for i in range(1,4)])).otherwise(F.array(F.lit(''))))
  .withColumn("col3",F.explode(F.col("test"))).drop("test")
  .withColumn("col3",F.concat(F.col("col1"),F.col("col3")))).show()

जैसा कि @MohammadMurtazaHashmi द्वारा सुझाया गया है, इसका एक साफ-सुथरा संस्करण इस तरह दिखेगा:

(df.withColumn("test",F.when(df['col2']=='Repeat',
     F.array([F.concat(F.col("col1"),F.lit(str(i))) for i in range(1,4)]))
    .otherwise(F.array(F.col("col1"))))
    .select("id","col1","col2", F.explode("test"))).show()

+---+-----+---------+------+
| id| col1|     col2|  col3|
+---+-----+---------+------+
|  1|Hello|   Repeat|Hello1|
|  1|Hello|   Repeat|Hello2|
|  1|Hello|   Repeat|Hello3|
|  2| Word|   Repeat| Word1|
|  2| Word|   Repeat| Word2|
|  2| Word|   Repeat| Word3|
|  3|  Aux|No repeat|   Aux|
|  4| Test|   Repeat| Test1|
|  4| Test|   Repeat| Test2|
|  4| Test|   Repeat| Test3|
+---+-----+---------+------+
3
anky 16 अप्रैल 2020, 18:10