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

时间:2017-10-20 07:09:21

标签: python apache-spark dataframe pyspark subsampling

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

我知道一种可能的方法是获取' df1'作为矢量:

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

但我的问题是:有没有其他方法可以获得相同的结果而不是在列表中加载数据?我问这个问题是因为当你有一个巨大的数据集时,可能无法通过收集和生成另一个数据帧来高效地加载数据。

感谢。

1 个答案:

答案 0 :(得分:0)

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:, :])