pyspark.sql两种行转列pivot和collect用法比较及concat_ws 组合使用

一、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|
+----+-----------+
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PySpark Structured Streaming中实现行转列可以使用`groupBy`和`pivot`函数。以下是一个示例步骤来实现行转列: 1. 首先使用`readStream`函数从流源(如Kafka或文件系统)读取数据流。 2. 通过应用必要的转换操作(如选择、过滤或添加列),将流数据转换为适当的模式。 3. 使用`groupBy`函数将数据按照要转置的列进行分组。 4. 使用`pivot`函数指定需要转置的列和值列,将每个唯一值列转换为新的列。 5. 使用所需的聚合操作(如`count`、`sum`等)对转置后的数据进行聚合操作。 6. 使用`writeStream`将转置后的数据流写入输出源(如Kafka、文件系统等)。 以下是一个示例代码,假设数据流中包含`name`、`date`和`value`列,我们希望将`name`列转置为多个新列: ```python from pyspark.sql import SparkSession from pyspark.sql.functions import * # 创建SparkSession对象 spark = SparkSession.builder.appName("StructuredStreamingExample").getOrCreate() # 从流源读取数据流 stream_data = spark.readStream.format("kafka").option("kafka.bootstrap.servers", "localhost:9092").load() # 将数据流转换为适当的模式 parsed_data = stream_data.selectExpr("CAST(value AS STRING)").select(from_json("value", "<schema>").alias("data")).select("data.*") # 分组和转置操作 transposed_data = parsed_data.groupBy("date").pivot("name").agg(sum("value")) # 将转置后的数据流写入输出源 query = transposed_data.writeStream.format("kafka").option("kafka.bootstrap.servers", "localhost:9092").start() # 等待流查询完成 query.awaitTermination() ``` 请注意,上述示例代码仅为演示目的,并未提供完整的模式和输出配置。您需要根据您的特定要求进行相应的模式定义和输出配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值