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(窗口))