how to get first value and last value from dataframe column in pyspark?

Sai*_*Sai 3 apache-spark apache-spark-sql pyspark pyspark-sql

I Have Dataframe,I want get first value and last value from DataFrame column.

+----+-----+--------------------+
|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|
+----+-----+--------------------+
Run Code Online (Sandbox Code Playgroud)

expecting output is from support column first,last value i.e x=[0.23809523809523808,0.047619047619047616.]

Oli*_*Oli 5

您可以使用collect但性能会很糟糕,因为驱动程序将收集所有数据,只是为了保留第一个和最后一个项目。更糟糕的是,如果你有一个大数据帧,它很可能会导致 OOM 错误,因此根本不起作用。

另一个想法是使用aggfirstlast聚合功能。这不起作用!(因为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
Run Code Online (Sandbox Code Playgroud)

最后,由于仅仅为了获取第一个和最后一个元素而对数据帧进行排序是一种耻辱,我们可以使用 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()
Run Code Online (Sandbox Code Playgroud)