Pyspark: получить процентный результат после groupBy

1

Например, вот мои тестовые данные

test = spark.createDataFrame([
    (0, 1, 5, "2018-06-03", "Region A"),
    (1, 1, 2, "2018-06-04", "Region B"),
    (2, 2, 1, "2018-06-03", "Region B"),
    (3, 3, 1, "2018-06-01", "Region A"),
    (3, 1, 3, "2018-06-05", "Region A"),
])\
  .toDF("orderid", "customerid", "price", "transactiondate", "location")
test.show()

Я могу получить данные обобщения, подобные этому

test.groupBy("customerid", "location").agg(sum("price")).show()

Изображение 174551

но я также хочу, чтобы процентные данные, что-то вроде этого

+----------+--------+----------+ 
|customerid|location|sum(price)| percentage
+----------+--------+----------+ 
|         1|Region B|         2|    20%
|         1|Region A|         8|    80%
|         3|Region A|         1|    100%
|         2|Region B|         1|    100%
+----------+--------+----------+

я хочу знать

  • Как мне это сделать? возможно, используя функцию окна?
  • Могу ли я поворачивать таблицу, превращая ее в нечто подобное? (с колонкой процента и суммы)

Изображение 174551


Я только нахожу пример pandas в Как получить процент отчислений столбца после groupby в Pandas

ОБНОВИТЬ:

С помощью @Gordon Linoff я могу получить процент от

from pyspark.sql.window import Window
test.groupBy("customerid", "location").agg(sum("price"))\
  .withColumn("percentage", col("sum(price)")/sum("sum(price)").over(Window.partitionBy(test['customerid']))).show()
Теги:
pyspark
group-by

1 ответ

1
Лучший ответ

ЭТО ОТВЕЧАЕТ ОРИГИНАЛЬНУЮ ВЕРСИЮ ВОПРОСА.

В SQL вы можете использовать функции окна:

select customerid, location, sum(price),
       (sum(price) / sum(sum(price)) over (partition by customerid) as ratio
from t
group by customerid, location;
  • 0
    Привет, теперь я могу заставить его работать. Большое спасибо тебе. Кроме того, я могу изменить результат? Я обновил свой вопрос
  • 0
    @ cqcn1991. , , Новые вопросы следует задавать как новые вопросы, а не путем редактирования существующих вопросов и даже аннулирования ответов на них.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню