![](/img/trans.png)
[英]I have dataFrame as below and want to add remarks based on the column values using 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的更多訪問次數 ”具有多個具有不同價值和訪問次數的記錄。
可能不是最好的解決方案,但這是一個可行的解決方案:
首先將您的dataFrame
按val
和visits
及其計數進行分組
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.