如何从pyspark的dataframe列中获取第一个值和最后一个值?

时间:2019-06-04 10:38:08

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我有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.]

2 个答案:

答案 0 :(得分:1)

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

另一个想法是将aggfirstlast聚合函数一起使用。这行不通! (因为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]