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