नमूना डीएफ:

var some_df = Seq(
("A", "no"),
("B", "yes"),
("B", "yes"),
("B", "no")
).toDF(
"user_id", "phone_number")

Some_df.शो ()

+-------+------------+
|user_id|phone_number|
+-------+------------+
|      A|          no|
|      B|         yes|
|      B|         yes|
|      B|          no|
+-------+------------+

मैं प्रत्येक user_id के लिए "हां" की संख्या गिनने का प्रयास कर रहा हूं।

कोड:

val omg_window = Window.partitionBy($"user_id")
some_df = some_df.withColumn("my_col", 
count($"phone_number"==="yes").over(omg_window)).drop("phone_number")
some_df.show()

मेरा ओपी:

 +-------+------+
 |user_id|my_col|
 +-------+------+
 |      B|     3|
 |      B|     3|
 |      B|     3|
 |      A|     1|
 +-------+------+

अपेक्षित ओपी:

User Id .   my_col
 B .         2
 A .         0

मैं कहाँ गलत हो रहा हूँ इस पर कोई सुझाव अत्यधिक मददगार होगा

0
data_person 21 जून 2018, 02:09

1 उत्तर

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

चूंकि आप डेटा फ्रेम को कम कर रहे हैं, इसलिए विंडो फ़ंक्शन के बजाय groupBy.agg का उपयोग करें; यहां आप phone_number कॉलम की तुलना yes स्ट्रिंग ($"phone_number" === "yes") से करते हैं और परिणाम को पूर्णांक में बदलते हैं जो true को 1 और false में बदल देता है। 0 और फिर हम 1s की गणना sumकॉलम में करके करते हैं:

some_df.groupBy("user_id").agg(
    sum(($"phone_number" === "yes").cast("integer")).as("my_col")
).show
+-------+------+
|user_id|my_col|
+-------+------+
|      B|     2|
|      A|     0|
+-------+------+
0
Psidom 21 जून 2018, 02:18