计算一组给定列的不同列值

时间:2020-08-24 06:26:26

标签: scala dataframe apache-spark

想象一个数据框,如下所示:

  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来做到这一点,但一直无法解决语法问题。任何指针都非常感谢。

2 个答案:

答案 0 :(得分:1)

通过使用Windowrank,您将获得不同的行号并取最大值。

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))