一、pivot用法
def pivot(self, pivot_col, values=None):
Pivots a column of the current :class: DataFrame and perform the specified aggregation.
翻译: pivot当前DataFrame的一列并执行指定的聚合。翻译成人话就是:使用聚合函数,聚合指定的列,将聚合后的数据行转列。
pyspark.sql.GroupedData.pivot有两个参数
Parameters:
pivot_col – Name of the column to pivot.–要被pivot的列名
values – List of values that will be translated to columns in the output DataFrame.–将要被转换为输出的DataFrame的列名列表
它是pyspark.sql.GroupedData中的用法
举例,指定列名列表value
df = spark.createDataFrame([('dotNET', 5000, 1,2022), ('dotNET', 4000, 2,2022),('dotNET', 3000, 3,2022),('dotNET', 2000, 4,2022),('Java', 2000,1, 2022),('Java', 3500,2, 2022),('Java', 3400,3, 2022),('Java', 4600,4, 2022),('Java', 2000,1, 2023),('Java', 2500,2, 2023),('dotNET', 2400,1, 2023),('dotNET', 2600,2, 2023)], ['course', 'earnings','quarter', 'year'])
df.show()
+------+--------+-------+----+
|course|earnings|quarter|year|
+------+--------+-------+----+
|dotNET| 5000| 1|2022|
|dotNET| 4000| 2|2022|
|dotNET| 3000| 3|2022|
|dotNET| 2000| 4|2022|
| Java| 2000| 1|2022|
| Java| 3500| 2|2022|
| Java| 3400| 3|2022|
| Java| 4600| 4|2022|
| Java| 2000| 1|2023|
| Java| 2500| 2|2023|
|dotNET| 2400| 1|2023|
|dotNET| 2600| 2|2023|
+------+--------+-------+----+
df1=df.groupBy("year").pivot("course", ["dotNET", "Java"]).sum("earnings")
df1.show()
+----+------+-----+
|year|dotNET| Java|
+----+------+-----+
|2022| 14000|13500|
|2023| 5000| 4500|
+----+------+-----+
二、collect_list(col)用法
它是pyspark.sql.functions 中的用法,使用前需先导入
import pyspark.sql.functions as F
详细使用请看我的另一篇文章pyspark.sql.functions中collect_list(col)
三、pivot和concat_ws 组合使用
在一些情况下我们需要将字段拼接成特定的格式,比如用‘#’或‘$’ 拼接,可以使用concat_ws(sep, *cols)
import pyspark.sql.functions as F
data_ws = df1.select(df1.year,F.concat_ws('#', df1.Java, df1.dotNET).alias('s'))
data_ws.show()
+----+-----------+
|year| s|
+----+-----------+
|2022|13500#14000|
|2023| 4500#5000|
+----+-----------+