pyspark dataframe列的合并与拆分

本文介绍使用SparkSQL进行数据处理的方法,包括DataFrame列数据的合并、拆分、将一行数据转换为多行以及多行数据转换为多列的详细操作步骤。通过实际代码示例,展示了如何利用SparkSQL内置函数实现数据的灵活转换。

使用Spark SQL在对数据进行处理的过程中,可能会遇到对一列数据拆分为多列,或者把多列数据合并为一列。这里记录一下目前想到的对DataFrame列数据进行合并和拆分的几种方法。

from pyspark.sql import SparkSession
spark = SparkSession.builder \
    .master("local") \
    .appName("dataframe_split") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

sc = spark.sparkContext
df = spark.read.csv('hdfs://master:9000/dataset/dataframe_split.csv', inferSchema=True, header=True)
df.show(3)

原始数据如下所示

  • dataframe列数据的分割

from pyspark.sql.functions import split, explode, concat, concat_ws
df_split = df.withColumn("s", split(df['score'], " "))
df_split.show()

 

  • dataframe列数据的拆分

zipWithIndex:给每个元素生成一个索引 

排序首先基于分区索引,然后是每个分区内的项目顺序.因此,第一个分区中的第一个item索引为0,最后一个分区中的最后一个item的索引最大.当RDD包含多个分区时此方法需要触发spark作业.

first_row = df.first()
numAttrs = len(first_row['score'].split(" "))
print("新增列的个数", numAttrs)
attrs = sc.parallelize(["score_" + str(i) for i in range(numAttrs)]).zipWithIndex().collect()
print("列名:", attrs)
for name, index in attrs:
    df_split = df_split.withColumn(name, df_split['s'].getItem(index))
df_split.show()

 

  • dataframe将一行分成多行

df_explode = df.withColumn("e", explode(split(df['score'], " ")))
df_explode.show()

 

  • dataframe列数据的合并

列的合并有两个函数:一个不添加分隔符concat(),一个添加分隔符concat_ws()

concat

df_concat = df_split.withColumn("score_concat", concat(df_split['score_0'], \
                                                       df_split['score_1'], df_split['score_2'], df_split['score_3']))
df_concat.show()

 

caoncat_ws

df_ws = df_split.withColumn("score_concat", concat_ws('-', df_split['score_0'], \
                                                       df_split['score_1'], df_split['score_2'], df_split['score_3']))
df_ws.show()

  • dataframe多行转多列

pivot: 旋转当前[[dataframe]]列并执行指定的聚合 

#DataFrame 数据格式:每个用户对每部电影的评分 userID 用户ID,movieID 电影ID,rating评分
df=spark.sparkContext.parallelize([[15,399,2], \
                                   [15,1401,5], \
                                   [15,1608,4], \
                                   [15,20,4], \
                                   [18,100,3], \
                                   [18,1401,3], \
                                   [18,399,1]])\
                    .toDF(["userID","movieID","rating"])
#pivot 多行转多列
resultDF = df.groupBy("userID").pivot("movieID").sum("rating").na.fill(-1)
#结果
resultDF.show()

参考文献:

Spark DataFrame 列的合并与拆分

Spark DataFrame 多行转多列

PySpark中,使用concat函数可以将多个的值合为一个。引用中的示例代码展示了如何使用concat函数。首先,我们需要创建一个SparkSession并读取CSV文件。然后,使用withColumn方法将要拼接的传递给concat函数,并指定拼接后的新的名称。最后,使用show方法来展示结果。 以下是一个示例代码: ``` from pyspark.sql import SparkSession from pyspark.sql.functions import concat spark = SparkSession.builder.master("local").appName("concat_example").getOrCreate() # 读取CSV文件 df = spark.read.csv("./demo.csv", inferSchema=True, header=True) # 使用concat函数将gid和score合并为一个新 df_concat = df.withColumn("concat_column", concat(df["gid"], df["score"])) # 展示结果 df_concat.show() ``` 执行以上代码后,将会展示包含合并的数据框。 请注意,示例中的concat函数仅演示了将两合并为一个新的情况。如果要合并多个,只需在concat函数中添加更多的参数即可。 引用中的代码展示了如何使用split函数将一个包含分隔符的字符串拆分为多个。可以将split函数concat函数一起使用,将多列拆分后再进行合并。 希望这个解答对你有所帮助!1<em>2</em> #### 引用[.reference_title] - *1* [pyspark案例系3-dataframe实现mysql的group_concat功能](https://blog.youkuaiyun.com/u010520724/article/details/117218576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [PySpark 合并拆分](https://blog.youkuaiyun.com/Harrytsz/article/details/121505056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值