如何对PySpark DataFrame的每一列中的数据进行混洗? [英] How to shuffle the data in each of the columns of a PySpark DataFrame?

查看:17
本文介绍了如何对PySpark DataFrame的每一列中的数据进行混洗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是用PySpark编程的初学者。我在CSV文件中有以下数据,该文件正在被读入Spark Dataframe,并且我希望从一个小数据集开始生成一个大型数据集。

# read the csv file in a spark dataframe
df = (spark.read
       .option("inferSchema", "true")
       .option("header", "true")
       .csv(file_path))
我想要对每一列中的数据进行混洗,即分别为‘InvoiceNo’、‘StockCode’、‘Description’,如下面的快照所示。

实现了以下代码以按列值随机排序:

from pyspark.sql.functions import *

df.orderBy("InvoiceNo", rand()).show(10)

即使在执行上面的操作之后,我也无法获得正确的输出。有人能帮忙解决这个问题吗?还引用了此链接:Randomly shuffle column in Spark RDD or dataframe但提到的代码引发错误。

推荐答案

函数可用于在数据帧上创建一列随机值。然后,可以按新列对数据帧进行排序,以产生随机顺序,例如

from pyspark.sql.functions import rand

df.withColumn('rand', rand(seed=42)).orderBy('rand')

要单独随机化每列的顺序,请分别为每列创建一个Dataframe并随机化,每列都有一个唯一的种子,例如

col_1_df = df.select('col_1').withColumn('rand', rand(seed=seed_1)).orderBy('rand')
col_2_df = df.select('col_2').withColumn('rand', rand(seed=seed_2)).orderBy('rand')

要将Dataframe与原始列重新组合,您可以添加行号,然后对其进行联接,例如

window = Window().orderBy(lit('A'))
col_1_with_row_num = col_1_df.withColumn("row_num", row_number().over(window))
col_2_with_row_num = col_2_df.withColumn("row_num", row_number().over(window))

col_1_with_row_num.join(col_2_with_row_num, on=['row_num']).select('col_1', 'col_2').show()

这篇关于如何对PySpark DataFrame的每一列中的数据进行混洗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆