如何对PySpark DataFrame的每一列中的数据进行混洗? [英] How to shuffle the data in each of the columns of a PySpark DataFrame?
本文介绍了如何对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屋!
查看全文