[英]how to get first value and last value from dataframe column in pyspark?
我有数据帧,我想从数据帧列中获取第一个值和最后一个值。
+----+-----+--------------------+
|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.]
您可以使用collect
但性能会很糟糕,因为驱动程序将收集所有数据,只是为了保留第一个和最后一个项目。 更糟糕的是,如果你有一个大数据帧,它很可能会导致 OOM 错误,因此根本不起作用。
另一个想法是将agg
与第first
和last
聚合函数一起使用。 这不起作用! (因为reducers不一定按照dataframe的顺序获取记录)
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
来索引数据帧,并且只保留第一个和最后一个元素。
size = df.count()
df.rdd.zipWithIndex()\
.filter(lambda x : x[1] == 0 or x[1] == size-1)\
.map(lambda x : x[0].support)\
.collect()
您可以尝试索引数据框,请参见以下示例:
df = <your dataframe>
first_record = df.collect()[0]
last_record = df.collect()[-1]
编辑:您还必须传递列名。
df = <your dataframe>
first_record = df.collect()[0]['column_name']
last_record = df.collect()[-1]['column_name']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.