我有Dataframe,我想从DataFrame列中获取第一个值和最后一个值。
+----+-----+--------------------+
|test|count| support|
+----+-----+--------------------+
| A| 5| 0.23809523809523808|
| B| 5| 0.23809523809523808|
| C| 4| 0.19047619047619047|
| G| 2| 0.09523809523809523|
| K| 2| 0.09523809523809523|
| D| 1|0.047619047619047616|
+----+-----+--------------------+
期望输出来自支持列的第一,最后一个值,即x=[0.23809523809523808,0.047619047619047616.]
答案 0 :(得分:1)
您可以使用collect
,但是由于驱动程序将收集所有数据,仅保留第一个和最后一个项目,因此性能将很糟糕。更糟糕的是,它很可能会导致OOM错误,因此如果您的数据帧很大,则根本无法工作。
另一个想法是将agg
与first
和last
聚合函数一起使用。这行不通! (因为reducer不一定按数据帧的顺序获取记录)
Spark提供了head
函数,这使得获取第一个元素非常容易。但是,spark不提供任何last
功能。一种简单的方法是将数据框向后排序,然后再次使用head
函数。
first=df.head().support
import pyspark.sql.functions as F
last=df.orderBy(F.monotonically_increasing_id().desc()).head().support
最后,由于仅对数据框进行排序以获取其第一个和最后一个元素是可耻的,因此我们可以使用RDD API和zipWithIndex
来索引数据框,而仅保留第一个和最后一个元素。 / p>
size = df.count()
df.rdd.zipWithIndex()\
.filter(lambda x : x[1] == 0 or x[1] == size-1)\
.map(lambda x : x[0].support)\
.collect()
答案 1 :(得分:-2)
您可以尝试为数据框建立索引,请参见以下示例:
df = <your dataframe>
first_record = df.collect()[0]
last_record = df.collect()[-1]