Scala 对给定列集的不同列值进行计数

Scala 对给定列集的不同列值进行计数,scala,dataframe,apache-spark,Scala,Dataframe,Apache Spark,设想一个数据帧,如下所示: Id Date FileType 1 2020JAN01 HTML 1 2020JAN01 TXT 2 2020FEB01 HTML 2 2020FEB02 HTML 如何创建一个列来计算给定“Id”和“Date”集合的“FileType”的不同值(比如说TotalTypes)。输出应该如下所示 Id Date FileType TotalTypes 1 2020J

设想一个数据帧,如下所示:

Id    Date        FileType
1     2020JAN01   HTML
1     2020JAN01   TXT
2     2020FEB01   HTML
2     2020FEB02   HTML
如何创建一个列来计算给定“Id”和“Date”集合的“FileType”的不同值(比如说
TotalTypes
)。输出应该如下所示

Id    Date        FileType    TotalTypes
1     2020JAN01   HTML        2
1     2020JAN01   TXT         2
2     2020FEB01   HTML        1
2     2020FEB02   HTML        1

我想用spark/scala来实现这一点,但一直无法使用语法。非常感谢任何指针。

通过使用
窗口
可以获得不同的行号并取最大值

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

通过使用
窗口
可以得到不同的行号并取最大值

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|
+---+---------+--------+----------+
这可能行得通

import org.apache.spark.sql.expressions.Window
导入spark.implicits_
导入org.apache.spark.sql.functions.{collect\u set,size}
val window=window.partitionBy($“Id”,“日期”)
df.withColumn(“TotalTypes”,大小(collect\u set($“FileType”)).over(窗口))
这可能有效

import org.apache.spark.sql.expressions.Window
导入spark.implicits_
导入org.apache.spark.sql.functions.{collect\u set,size}
val window=window.partitionBy($“Id”,“日期”)
df.withColumn(“TotalTypes”,大小(collect\u set($“FileType”)).over(窗口))