Найти соотношение в сгруппированных данных в DataFrame

Вот фрейм данных - в основном, есть два возможных типа - X и Y для разных источников A, B, C, D...

Source | Type
-------------------
  A    |  X
  A    |  Y
  B    |  X
  C    |  Y
  A    |  X
  D    |  Y
 ...   | ...

Конечная цель — набрать процентное соотношение: ratio(X in A) = count(X) / (count(X) + count(Y))

Итак, в нашем примере ratio(X in A) = 2 / (2 + 1) = 2 / 3 ~ 0.667

Очень просто, но я не могу понять, как это сделать в один выбор, используя только Streaming API v2 (структурированная потоковая передача, кадры данных)? С моей точки зрения, это возможно только с помощью функций map...

Вот что у меня сейчас есть - разбросанные счетчики для X и Y типов

        msgDataFrame
                .select(SOURCE, TYPE)
                .where(msgDataFrame.col(TYPE).equalTo("X"))
                .groupBy(SOURCE)
                .count()
                .show(); // <-- gives me count for 'X'-es

        msgDataFrame
                .select(SOURCE, TYPE)
                .filter(msgDataFrame.col(TYPE).equalTo("Y"))
                .groupBy(SOURCE)
                .count()
                .show(); // <-- gives me count for 'Y'-cs
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно работать:

msgDataFrame
.select("SOURCE", "TYPE")
.groupBy("SOURCE").pivot("TYPE", Seq("X", "Y")).agg(count(col("TYPE")))
.withColumn("Ratio", col("X") / (col("X") + col("Y")))
.show 

Другие вопросы по теме