Подсчитывать различные значения столбцов для заданного набора столбцов

#scala #dataframe #apache-spark

#scala #фрейм данных #apache-spark

Вопрос:

Представьте фрейм данных, как показано ниже:

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

Как я могу создать столбец, который подсчитывает (скажем TotalTypes ) различные значения «FileType» для заданного набора «Id» и «Date». Вывод должен выглядеть так, как показано ниже.

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

Я хочу сделать это с помощью spark / scala, но не смог разобраться с синтаксисом. Любые указатели высоко ценятся.

Ответ №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|
 --- --------- -------- ---------- 
  

Ответ №2:

Это может сработать

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