如何在 PySpark 数据框中找到该列中存在的所有唯一值的列分布?

How to find the distribution of a column in PySpark dataframe for all the unique values present in that column?

我有一个 PySpark 数据框-

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 列中有 n 个唯一值,我希望输出数据框中的 n 列具有相应数量的获得那么多奖牌的用户。

上面给出的数据的输出应该是这样的-

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

如何实现?

很简单pivot:

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

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

如果你需要一些cosmetic在栏目名称中添加单词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|
+--------+--------+--------+--------+