1

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

我知道一种可能的方法是将“df1”的内容作为向量获取:

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

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

谢谢。

4

1 回答 1

0

Pyspark 数据框没有索引。您可以创建一个,但请注意,在创建索引之前发生的任何 shuffle 操作 ( 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:, :])
于 2017-10-20T07:35:15.540 回答