如何提取数据框的具体子样本并保存在pyspark中的另一个数据框中?
问题描述:
我有一个名为'df1'的数据框,它有X行,假设为1000.我想要做的是获得该数据框的具体子采样并保存为另一个。例如,我想从'df1'中提取400到700行并将其保存为'df2'。如何提取数据框的具体子样本并保存在pyspark中的另一个数据框中?
我知道,一个可能的方式越来越“DF1”的内容与载体:
list = df1.collect()
subsample = list[400:700]
df2 = sc.createDataFrame(subsample, attributes)
但我的问题是:是否有越来越不加载数据的相同结果的任何其他方式一个列表?我这样问,因为当你有一个巨大的数据集时,使用collect和产生另一个数据框可能不会有效地加载数据。
谢谢。
答
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:, :])
没有行号的星火。 – mtoto
不,但是如果你有一个增量的'IDENT'属性,相当于一个行号的表示? – jartymcfly
然后你可以使用'filter()' – mtoto