Как найти распределение столбца в PySpark dataframe для всех уникальных значений, присутствующих в этом столбце?

#python-3.x #pyspark #apache-spark-sql #pyspark-dataframes

#python-3.x #pyspark #apache-spark-sql #pyspark-dataframes

Вопрос:

У меня есть PySpark dataframe-

 df = spark.createDataFrame([
    ("u1", 0),
    ("u2", 0),
    ("u3", 1),
    ("u4", 2),
    ("u5", 3),
    ("u6", 2),],
    ['user_id', 'medals'])

df.show()
 

Вывод-

  ------- ------ 
|user_id|medals|
 ------- ------ 
|     u1|     0|
|     u2|     0|
|     u3|     1|
|     u4|     2|
|     u5|     3|
|     u6|     2|
 ------- ------ 
 

Я хочу получить распределение столбца medals для всех пользователей. Итак, если в столбце medals есть n уникальных значений, я хочу, чтобы в выходном фрейме данных было n столбцов с соответствующим количеством пользователей, получивших столько медалей.

Выходные данные для приведенных выше данных должны выглядеть следующим образом-

  -------  -------- -------- -------- 
|medals_0|medals_1|medals_2|medals_3|
 -------- -------- -------- -------- 
|       2|       1|       2|       1|
 -------- -------- -------- -------- 
 

Как мне этого добиться?

Ответ №1:

это простой pivot :

 df.groupBy().pivot("medals").count().show()

 --- --- --- --- 
|  0|  1|  2|  3|
 --- --- --- --- 
|  2|  1|  2|  1|
 --- --- --- --- 
 

если вам нужно какое-то косметическое средство для добавления слова medals в название столбца, вы можете сделать это :

 medals_df = df.groupBy().pivot("medals").count()

for col in medals_df.columns:
    medals_df = medals_df.withColumnRenamed(col, "medals_{}".format(col))

medals_df.show()

 -------- -------- -------- -------- 
|medals_0|medals_1|medals_2|medals_3|
 -------- -------- -------- -------- 
|       2|       1|       2|       1|
 -------- -------- -------- --------