我有一个名为' df1'的数据框。它有X行,假设为1000.我想要做的是获得该数据帧的具体子样本并保存为另一个。例如,我想从' df1'中提取行400到700。并将其保存为' df2'。
我知道一种可能的方法是获取' df1'作为矢量:
list = df1.collect()
subsample = list[400:700]
df2 = sc.createDataFrame(subsample, attributes)
但我的问题是:有没有其他方法可以获得相同的结果而不是在列表中加载数据?我问这个问题是因为当你有一个巨大的数据集时,可能无法通过收集和生成另一个数据帧来高效地加载数据。
感谢。
答案 0 :(得分:0)
Pyspark数据框没有索引。您可以创建一个,但请注意,在创建索引之前发生的任何随机操作(group
,join
...)可能已更改了行的顺序。
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:, :])