簡體   English   中英

如何從pyspark的數據框列中獲取第一個值和最后一個值?

[英]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與第firstlast聚合函數一起使用。 這不起作用! (因為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']

從 3.0.0 版本開始,spark 也有名為.tail() 的DataFrame 函數來獲取最后一個值。

這將返回Row對象列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM