如何提取数据帧的具体子样本并保存在pyspark中的另一个数据帧中



我有一个名为"df1"的数据帧,它有X行,假设为1000行。我想做的是获得该数据帧的具体子样本,并保存为另一个。例如,我想从"df1"中提取行400到700,并将其保存为"df2"。

我知道一种可能的方法是将"df1"的内容作为一个向量:

list = df1.collect()
subsample = list[400:700]
df2 = sc.createDataFrame(subsample, attributes)

但我的问题是:有没有其他方法可以在不加载列表中的数据的情况下获得相同的结果?我之所以这么问,是因为当你有一个巨大的数据集时,用collect加载数据并生成另一个数据帧可能效率不高。

谢谢。

Pyspark数据帧没有索引。您可以创建一个,但请注意,在创建索引之前发生的任何混洗操作(groupjoin…)都可能更改了行的顺序。
import pyspark.sql.functions as psf
start = 400
end = 700
df2 = df1.rdd.zipWithIndex()
.map(lambda l: [l[1]] + list(l[0]))
.toDF(["index"] + df1.columns)
.filter(psf.col("index").between(start, end))

另一种方法是只将数据帧的第一行收集到列表中:

df2 = spark.createDataFrame(df1.head(end)[start:], df1.columns)

或使用Pandas:

df2 = spark.createDataFrame(df1.limit(end).toPandas().iloc[start:, :])

最新更新