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

问题描述 投票:0回答:4

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

apache-spark pyspark apache-spark-sql
4个回答
8
投票

您可以使用

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()

2
投票

您可以尝试对数据框建立索引,请参阅下面的示例:

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']

2
投票

从3.0.0版本开始,spark也有DataFrame函数称为 .tail() 获取最后一个值。

这将返回

Row
对象列表:

last=df.tail(1)[0].support

0
投票

一个更简单的单行答案,使用

head and tail
df:

获取名为 ci_number 的 col 的第一个元素
list(df.select('ci_number').head(1)[0].asDict().values())[0]
获取名为 ci_number 的最后一个元素
list(df.select('ci_number').tail(1)[0].asDict().values())[0]
© www.soinside.com 2019 - 2024. All rights reserved.