想象一个数据框,如下所示:
sal annualsalary bonus
1000 12000 200.0
1400 16800 280.0
1200 14400 240.0
1400 16800 280.0
1500 18000 300.0
1500 18000 300.0
1100 13200 220.0
1300 15600 260.0
1000 12000 200.0
1000 12000 200.0
如何创建一个列,该列计算(给定Id Date FileType
1 2020JAN01 HTML
1 2020JAN01 TXT
2 2020FEB01 HTML
2 2020FEB02 HTML
)对于给定的“ Id”和“ Date”集的“ FileType”的不同值。输出应如下图所示。
TotalTypes
我想使用spark / scala来做到这一点,但一直无法解决语法问题。任何指针都非常感谢。
答案 0 :(得分:1)
通过使用Window
和rank
,您将获得不同的行号并取最大值。
import org.apache.spark.sql.expressions.Window
val w1 = Window.partitionBy("Id", "Date").orderBy("FileType")
val w2 = Window.partitionBy("Id", "Date")
df.withColumn("TotalTypes", max(rank().over(w1)).over(w2)).show
+---+---------+--------+----------+
| Id| Date|FileType|TotalTypes|
+---+---------+--------+----------+
| 1|2020JAN01| HTML| 2|
| 1|2020JAN01| TXT| 2|
| 2|2020FEB01| HTML| 1|
| 2|2020FEB02| HTML| 1|
+---+---------+--------+----------+
答案 1 :(得分:1)
这可能有效
import org.apache.spark.sql.expressions.Window
import spark.implicits._
import org.apache.spark.sql.functions.{collect_set, size}
val window = Window.partitionBy($"Id", $"Date")
df.withColumn("TotalTypes", size(collect_set($"FileType")).over(window))