Spark SQL ленивый счет - PullRequest
       4

Spark SQL ленивый счет

1 голос
/ 11 апреля 2019

Мне нужно использовать количество данных в качестве делителя для расчета процентов.

Вот что я делаю:

scala> val df = Seq(1,1,1,2,2,3).toDF("value")
scala> val overallCount = df.count
scala> df.groupBy("value")
         .agg( count(lit(1)) / overallCount )

Но я бы хотел избежать действия df.count, так как оно будет оценено немедленно.

Аккумуляторы выиграны 'Это не поможет, так как они будут оценены заранее.

Есть ли способ выполнить отложенный подсчет для кадра данных?

1 Ответ

3 голосов
/ 11 апреля 2019

Вместо использования Dataset.count вы можете использовать простой запрос

val overallCount = df.select(count($"*") as "overallCount")

и позже crossJoin

df
  .groupBy("value")
  .agg(count(lit(1)) as "groupCount")
  .crossJoin(overallCount)
  .select($"value", $"groupCount" / $"overallCount")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...