簡體   English   中英

如何使用Scala添加備注列

[英]How to add remarks column using scala

我有如下dataFrame ,並想使用Scala添加備注

id    val  visits 
111   2        1
111   2        1
112   4        2
112   5        4
113   6        1

預期輸出應低於

id    val    visits   remarks
111   2        1      Ramdom
111   2        1      Ramdom
112   4        2      Less visit
112   5        4      More visit
113   6        1      One visit

備注應為:
Ramdom for Id擁有兩條具有相同價值和訪問次數的記錄
ID的一次訪問只有一個記錄,其中包含任何訪問次數
Id的減訪問有兩個記錄用更少的訪問相比其他
“ Id的更多訪問次數 ”具有多個具有不同價值和訪問次數的記錄。

可能不是最好的解決方案,但這是一個可行的解決方案:

首先將您的dataFramevalvisits及其計數進行分組

val grouped = df.groupBy("id").agg(max($"val").as("maxVal"), max($"visits").as("maxVisits"), min($"val").as("minVal"), min($"visits").as("minVisits"), count($"id").as("count"))

然后定義一個實現您的邏輯的UDF

val remarks = functions.udf ((value: Int, visits: Int, maxValue: Int, maxVisits: Int, minValue: Int, minVisits: Int, count: Int) =>
   if (count == 1) {
     "One Visit"
   }else if (value == maxValue && value == minValue && visits == maxVisits && visits == minVisits) {
     "Random"
   }else {
     if (visits < maxVisits) {
       "Less Visits"
     }else {
       "More Visits"
     }
   }
 )

然后將原始dataFrame和按id分組的一組加入,並用UDF添加所需的列。 最后,從輸出中刪除不需要的列:

 df.join(grouped, Seq("id"))
   .withColumn("remarks", remarks($"val", $"visits", $"maxVal", $"maxVisits", $"minVal", $"minVisits", $"count"))
   .drop("maxVal","maxVisits", "minVal", "minVisits", "count")

輸出:

+---+----+-------+-----------+
| id| val| visits|    remarks|
+---+----+-------+-----------+
|112|   4|      2|Less Visits|
|112|   5|      4|More Visits|
|113|   6|      1|  One Visit|
|111|   2|      1|     Random|
|111|   2|      1|     Random|
+---+----+-------+-----------+

PS記得導入功能

import org.apache.spark.sql.functions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM