मेरे पास 2 पाइस्पार्क डेटाफ्रेम हैं

डेटाफ़्रेम 1 - df जहां कॉलम customer_id, address_id, order_id, date the order was placed, order_share हैं

+----+----+--------+----------+-----------+
|c_id|a_id|order_id|order_date|order_share|
+----+----+--------+----------+-----------+
|  c1|  a1|       1|2021-01-23|        0.5|
|  c1|  a2|       1|2021-01-23|        0.2|
|  c1|  a3|       1|2021-01-23|        0.3|
|  c2|  a5|       2|2021-03-20|        0.4|
|  c2|  a6|       2|2021-03-20|        0.6|
|  c1|  a1|       3|2021-02-20|        0.3|
|  c1|  a2|       3|2021-02-20|        0.3|
|  c1|  a3|       3|2021-02-20|        0.4|
+----+----+--------+----------+-----------+

डेटाफ़्रेम 2 - df_address जहां कॉलम customer_id, address_id, the date of address creation हैं

+----+----+------------+
|c_id|a_id|created_date|
+----+----+------------+
|  c1|  a1|  2020-12-31|
|  c1|  a2|  2020-04-23|
|  c1|  a3|  2020-03-23|
|  c1|  a4|  2020-01-16|
|  c2|  a5|  2020-12-28|
|  c2|  a6|  2020-05-16|
|  c2|  a7|  2020-03-04|
+----+----+------------+

अब, मैं इन दोनों तालिकाओं में शामिल होना चाहता हूं ताकि प्रत्येक आदेश_आईडी के लिए, मुझे df_address से पता मिल जाए और order_share में संबंधित प्रविष्टि 0.0 होनी चाहिए। स्तंभ

मेरा आउटपुट दिखना चाहिए

+----+----+------------+--------+----------+-----------+
|c_id|a_id|created_date|order_id|order_date|order_share|
+----+----+------------+--------+----------+-----------+
|  c1|  a1|  2020-12-31|       1|2021-01-23|        0.5|
|  c1|  a2|  2020-04-23|       1|2021-01-23|        0.2|
|  c1|  a3|  2020-03-23|       1|2021-01-23|        0.3|
|  c1|  a4|  2020-01-16|       1|2021-01-23|        0.0|
|  c2|  a5|  2020-12-28|       2|2021-03-20|        0.4|
|  c2|  a6|  2020-05-16|       2|2021-03-20|        0.6|
|  c2|  a7|  2020-03-04|       2|2021-03-20|        0.0|
|  c1|  a1|  2020-12-31|       3|2021-02-20|        0.3|
|  c1|  a2|  2020-04-23|       3|2021-02-20|        0.3|
|  c1|  a3|  2020-03-23|       3|2021-02-20|        0.4|
|  c1|  a4|  2020-01-16|       3|2021-02-20|        0.0|
+----+----+------------+--------+----------+-----------+

यह सामान्य बाएं/दाएं शामिल होने जैसा नहीं दिखता है और मुझे इसे प्रत्येक ऑर्डर_आईडी के लिए करना चाहिए।

मैंने ['c_id','a_id'] का उपयोग करके शामिल होने का प्रयास किया लेकिन आउटपुट अपेक्षित के करीब नहीं है। df_address को बाएं और df को दाएं मानते हुए, लेफ्ट जॉइन का उपयोग करने से मुझे order_id और के लिए शून्य मान मिलते हैं राइट जॉइन मुझे df_address से सभी पते नहीं देता है

ऐसा लगता है कि मुझे प्रत्येक ऑर्डर_आईडी के लिए किसी प्रकार का ग्रुपबी लागू करना है और फिर प्रत्येक समूह के लिए शामिल होना है, लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए या यह भी सुनिश्चित करें कि इसके बारे में जाने का सही तरीका है या नहीं

किसी भी सहायता की सराहना की जाएगी। धन्यवाद!

1
Jitesh Malipeddi 29 सितंबर 2021, 07:39
Saya pikir Anda bingung, Anda menggunakan padding dengan kotak perbatasan, bukan margin.
 – 
Vaebhav
29 सितंबर 2021, 07:47
कृपया प्रश्न के संपादन की जाँच करें, मैंने उस समस्या का उल्लेख किया है जिसका सामना मैं लेफ्ट जॉइन करते समय कर रहा हूँ
 – 
Jitesh Malipeddi
29 सितंबर 2021, 07:56

2 जवाब

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

आप एक मध्यवर्ती orders डेटाफ़्रेम का उपयोग कर सकते हैं, जिसे df डेटाफ़्रेम से बनाया गया है और जिसमें केवल ऑर्डर के बारे में जानकारी है, जो कॉलम customer_id, order_id और order_date हैं। फिर आप पहले प्रत्येक जोड़े (customer_id, address_id) को ऑर्डर-विशिष्ट जानकारी से जोड़ने के लिए, इस orders डेटाफ़्रेम के साथ df_address डेटाफ़्रेम से जुड़ते हैं, और फिर परिणामी डेटाफ़्रेम में df डेटाफ़्रेम के साथ बाएं जुड़ते हैं प्रति पता order_share प्राप्त करें, फिर null मान को order_share कॉलम में 0.0 से बदलें।

यहाँ पूरा कोड है:

from pyspark.sql import functions as F

# Orders dataframe that contains only orders-specific information
orders = df.select('customer_id', 'order_id', 'order_date').distinct()

df_address.join(orders, ['customer_id']) \ # link addresses with orders
  .join(df.drop('order_date'), ['customer_id', 'address_id', 'order_id'], 'left_outer') \ # link orders/addresses with order shares
  .withColumn('order_share', F.when(F.col('order_share').isNotNull(), F.col('order_share')).otherwise(F.lit(0.0))) \ # replace null in order_share column with 0.0
  .orderBy('customer_id', 'order_id', 'address_id') \ # optional, to reorder dataframe

विवरण

ध्यान दें: मैंने यहां सभी डेटाफ़्रेम को order_id और address_id द्वारा पठनीयता के उद्देश्य से पुनः क्रमित किया है

आपके प्रश्न में df डेटाफ़्रेम से शुरू करके, हमें निम्न orders डेटाफ़्रेम प्राप्त होता है:

+-----------+--------+----------+
|customer_id|order_id|order_date|
+-----------+--------+----------+
|c1         |1       |2021-01-23|
|c2         |2       |2021-03-20|
|c1         |3       |2021-02-20|
+-----------+--------+----------+

फिर हम इस orders डेटाफ़्रेम को df_address डेटाफ़्रेम के साथ जोड़ते हैं:

+-----------+----------+------------+--------+----------+
|customer_id|address_id|created_date|order_id|order_date|
+-----------+----------+------------+--------+----------+
|c1         |a1        |2020-12-31  |1       |2021-01-23|
|c1         |a2        |2020-04-23  |1       |2021-01-23|
|c1         |a3        |2020-03-23  |1       |2021-01-23|
|c1         |a4        |2020-01-16  |1       |2021-01-23|
|c2         |a5        |2020-12-28  |2       |2021-03-20|
|c2         |a6        |2020-05-16  |2       |2021-03-20|
|c2         |a7        |2020-03-04  |2       |2021-03-20|
|c1         |a1        |2020-12-31  |3       |2021-02-20|
|c1         |a2        |2020-04-23  |3       |2021-02-20|
|c1         |a3        |2020-03-23  |3       |2021-02-20|
|c1         |a4        |2020-01-16  |3       |2021-02-20|
+-----------+----------+------------+--------+----------+

और बिना कॉलम order_date के df डेटाफ्रेम के साथ अंतिम जुड़ाव के साथ, हमें मिलता है:

+-----------+----------+--------+------------+----------+-----------+
|customer_id|address_id|order_id|created_date|order_date|order_share|
+-----------+----------+--------+------------+----------+-----------+
|c1         |a1        |1       |2020-12-31  |2021-01-23|0.5        |
|c1         |a2        |1       |2020-04-23  |2021-01-23|0.2        |
|c1         |a3        |1       |2020-03-23  |2021-01-23|0.3        |
|c1         |a4        |1       |2020-01-16  |2021-01-23|null       |
|c2         |a5        |2       |2020-12-28  |2021-03-20|0.4        |
|c2         |a6        |2       |2020-05-16  |2021-03-20|0.6        |
|c2         |a7        |2       |2020-03-04  |2021-03-20|null       |
|c1         |a1        |3       |2020-12-31  |2021-02-20|0.3        |
|c1         |a2        |3       |2020-04-23  |2021-02-20|0.3        |
|c1         |a3        |3       |2020-03-23  |2021-02-20|0.4        |
|c1         |a4        |3       |2020-01-16  |2021-02-20|null       |
+-----------+----------+--------+------------+----------+-----------+

इसके बाद हमें बस null को 0.0 से बदलना होगा और हमें अपना अपेक्षित डेटाफ्रेम मिल जाएगा:

+-----------+----------+--------+------------+----------+-----------+
|customer_id|address_id|order_id|created_date|order_date|order_share|
+-----------+----------+--------+------------+----------+-----------+
|         c1|        a1|       1|  2020-12-31|2021-01-23|        0.5|
|         c1|        a2|       1|  2020-04-23|2021-01-23|        0.2|
|         c1|        a3|       1|  2020-03-23|2021-01-23|        0.3|
|         c1|        a4|       1|  2020-01-16|2021-01-23|        0.0|
|         c2|        a5|       2|  2020-12-28|2021-03-20|        0.4|
|         c2|        a6|       2|  2020-05-16|2021-03-20|        0.6|
|         c2|        a7|       2|  2020-03-04|2021-03-20|        0.0|
|         c1|        a1|       3|  2020-12-31|2021-02-20|        0.3|
|         c1|        a2|       3|  2020-04-23|2021-02-20|        0.3|
|         c1|        a3|       3|  2020-03-23|2021-02-20|        0.4|
|         c1|        a4|       3|  2020-01-16|2021-02-20|        0.0|
+-----------+----------+--------+------------+----------+-----------+
1
Vincent Doba 29 सितंबर 2021, 16:36
Pertanyaan saya adalah - apakah mungkin mengikuti metode ini untuk membangun (mengarsipkan) aplikasi hanya dalam satu bahasa, dan kemudian yang kedua dalam bahasa lain?
 – 
Jitesh Malipeddi
29 सितंबर 2021, 16:14
बेकार distinct के बारे में, केवल customer_id, order_id और order_date वाली पंक्तियां अद्वितीय नहीं होंगी क्योंकि हमने address_id और order_share कॉलम हटा दिए हैं। आपके उदाहरण के साथ df डेटाफ़्रेम, यदि आप distinct को हटाते हैं, तो orders डेटाफ़्रेम में आपको तीन बार (c1, 1, 2021-01-23) पंक्ति, दो बार (c2, 2, 2021-03-20) पंक्ति और तीन बार (c1, 3, 2021-02-20) पंक्ति। तो आपको distinct रखना होगा। और हाँ, left_outer और left का मतलब दो डेटाफ़्रेम को जोड़ते समय एक ही है।
 – 
Vincent Doba
29 सितंबर 2021, 16:25
माफ करना मेरा बुरा। मेरे मन में कुछ और था। मैं distinct के उपयोग को समझता हूं। मैं केवल स्पष्ट करने के लिए, हम distinct का प्रयोग एक दूसरे के स्थान पर dropDuplicates के साथ करते हैं, है ना?
 – 
Jitesh Malipeddi
30 सितंबर 2021, 08:15

मैंने लापता c_id और a_id संयोजन प्राप्त करने और df से आने वाले शून्य कॉलम मानों के लिए isNull के साथ >कब और जब वे df_address से मान लेते हैं तो उन्हें बदल दिया जाता है नीचे परिणाम हैं -

डेटा तैयारी

input_str1 = """
c1|  a1|       1|2021-01-23|        0.5|
c1|  a2|       1|2021-01-23|        0.2|
c1|  a3|       1|2021-01-23|        0.3|
c2|  a5|       2|2021-03-20|        0.4|
c2|  a6|       2|2021-03-20|        0.6|
c1|  a1|       3|2021-02-20|        0.3|
c1|  a2|       3|2021-02-20|        0.3|
c1|  a3|       3|2021-02-20|        0.4
""".split("|")

input_values1 = list(map(lambda x: x.strip() if x.strip() != '' else None, input_str1))

cols1 = list(map(lambda x: x.strip() if x.strip() != '' else None, "c_id|a_id|order_id|order_date|order_share".split("|")))
            
n = len(input_values1)
n_col1 = 5

input_list1 = [tuple(input_values1[i:i+n_col1]) for i in range(0,n,n_col1)]

sparkDF1 = sql.createDataFrame(input_list1, cols1)

sparkDF1.show()

+----+----+--------+----------+-----------+
|c_id|a_id|order_id|order_date|order_share|
+----+----+--------+----------+-----------+
|  c1|  a1|       1|2021-01-23|        0.5|
|  c1|  a2|       1|2021-01-23|        0.2|
|  c1|  a3|       1|2021-01-23|        0.3|
|  c2|  a5|       2|2021-03-20|        0.4|
|  c2|  a6|       2|2021-03-20|        0.6|
|  c1|  a1|       3|2021-02-20|        0.3|
|  c1|  a2|       3|2021-02-20|        0.3|
|  c1|  a3|       3|2021-02-20|        0.4|
+----+----+--------+----------+-----------+

input_str2 = """
c1|  a1|  2020-12-31|
c1|  a2|  2020-04-23|
c1|  a3|  2020-03-23|
c1|  a4|  2020-01-16|
c2|  a5|  2020-12-28|
c2|  a6|  2020-05-16|
c2|  a7|  2020-03-04
""".split("|")

input_values2 = list(map(lambda x: x.strip() if x.strip() != '' else None, input_str2))

cols2 = list(map(lambda x: x.strip() if x.strip() != '' else None, "c_id|a_id|created_date".split("|")))
            
n = len(input_values2)
n_col2 = 3

input_list2 = [tuple(input_values2[i:i+n_col2]) for i in range(0,n,n_col2)]

sparkDF2 = sql.createDataFrame(input_list2, cols2)

sparkDF2.show()

+----+----+------------+
|c_id|a_id|created_date|
+----+----+------------+
|  c1|  a1|  2020-12-31|
|  c1|  a2|  2020-04-23|
|  c1|  a3|  2020-03-23|
|  c1|  a4|  2020-01-16|
|  c2|  a5|  2020-12-28|
|  c2|  a6|  2020-05-16|
|  c2|  a7|  2020-03-04|
+----+----+------------+

पूर्ण शामिल हों

स्पार्कडीएफ 2 से आने वाले कॉलम मानों का नाम बदलना, जो आगे अस्पष्ट कॉलम नामों से बचने के लिए शून्य मानों को पॉप्युलेट करने के लिए उपयोग किया जाएगा

finalDF = sparkDF1.join(sparkDF2
                       , (sparkDF1['c_id'] == sparkDF2['c_id'])
                        & (sparkDF1['a_id'] == sparkDF2['a_id'])
                        ,'full'
                ).select(sparkDF1['*']
                         ,sparkDF2['c_id'].alias('c_id_address')
                         ,sparkDF2['a_id'].alias('a_id_address')
                         ,sparkDF2['created_date']
                        )
finalDF.show()

+----+----+--------+----------+-----------+------------+------------+------------+
|c_id|a_id|order_id|order_date|order_share|c_id_address|a_id_address|created_date|
+----+----+--------+----------+-----------+------------+------------+------------+
|  c1|  a3|       1|2021-01-23|        0.3|          c1|          a3|  2020-03-23|
|  c1|  a3|       3|2021-02-20|        0.4|          c1|          a3|  2020-03-23|
|  c2|  a5|       2|2021-03-20|        0.4|          c2|          a5|  2020-12-28|
|null|null|    null|      null|       null|          c2|          a7|  2020-03-04|
|  c1|  a2|       1|2021-01-23|        0.2|          c1|          a2|  2020-04-23|
|  c1|  a2|       3|2021-02-20|        0.3|          c1|          a2|  2020-04-23|
|  c1|  a1|       1|2021-01-23|        0.5|          c1|          a1|  2020-12-31|
|  c1|  a1|       3|2021-02-20|        0.3|          c1|          a1|  2020-12-31|
|null|null|    null|      null|       null|          c1|          a4|  2020-01-16|
|  c2|  a6|       2|2021-03-20|        0.6|          c2|          a6|  2020-05-16|
+----+----+--------+----------+-----------+------------+------------+------------+

शून्य कब है

finalDF = finalDF.withColumn('c_id',F.when(F.col('c_id').isNull()
                                           ,F.col('c_id_address')).otherwise(F.col('c_id'))
                            )\
                    .withColumn('a_id',F.when(F.col('a_id').isNull()
                                              ,F.col('a_id_address')).otherwise(F.col('a_id'))
                            )\
                    .withColumn('order_share',F.when(F.col('order_share').isNull()
                                                     ,0.0).otherwise(F.col('order_share'))
                            )


finalDF.show()

+----+----+--------+----------+-----------+------------+------------+------------+
|c_id|a_id|order_id|order_date|order_share|c_id_address|a_id_address|created_date|
+----+----+--------+----------+-----------+------------+------------+------------+
|  c1|  a3|       1|2021-01-23|        0.3|          c1|          a3|  2020-03-23|
|  c1|  a3|       3|2021-02-20|        0.4|          c1|          a3|  2020-03-23|
|  c2|  a5|       2|2021-03-20|        0.4|          c2|          a5|  2020-12-28|
|  c2|  a7|    null|      null|        0.0|          c2|          a7|  2020-03-04|
|  c1|  a2|       1|2021-01-23|        0.2|          c1|          a2|  2020-04-23|
|  c1|  a2|       3|2021-02-20|        0.3|          c1|          a2|  2020-04-23|
|  c1|  a1|       1|2021-01-23|        0.5|          c1|          a1|  2020-12-31|
|  c1|  a1|       3|2021-02-20|        0.3|          c1|          a1|  2020-12-31|
|  c1|  a4|    null|      null|        0.0|          c1|          a4|  2020-01-16|
|  c2|  a6|       2|2021-03-20|        0.6|          c2|          a6|  2020-05-16|
+----+----+--------+----------+-----------+------------+------------+------------+

नोट - order_id और order_date शून्य हैं क्योंकि c_id और a_id संयोजन के लिए sparkDF2 में कोई मान मौजूद नहीं है

यह उदाहरण एक दृष्टिकोण प्रदान करता है, अपना आवश्यक समाधान प्राप्त करने की दिशा में, यदि आवश्यक हो तो ऑर्डर लापता मूल्यों को पॉप्युलेट करने के लिए आप और सुधार कर सकते हैं

0
Vaebhav 29 सितंबर 2021, 08:41