簡體   English   中英

如何將 groupBy 和聚合函數應用於 PySpark DataFrame 中的特定 window?

[英]How to apply groupBy and aggregate functions to a specific window in a PySpark DataFrame?

我想將groupBy和隨后的agg function 應用於 PySpark DataFrame,但僅限於特定的 Z2FBF245B8C35CBD276。 這最好用一個例子來說明。 假設我有一個名為df的數據集:

df.show()

    +-----+----------+----------+-------+
    |   ID| Timestamp| Condition|  Value|
    +-----+----------+----------+-------+
    |   z1|         1|         0|     50|
|-------------------------------------------|
|   |   z1|         2|         0|     51|   |
|   |   z1|         3|         0|     52|   |
|   |   z1|         4|         0|     51|   |
|   |   z1|         5|         1|     51|   |
|   |   z1|         6|         0|     49|   |
|   |   z1|         7|         0|     44|   |
|   |   z1|         8|         0|     46|   |
|-------------------------------------------|
    |   z1|         9|         0|     48|
    |   z1|        10|         0|     42|
 +-----+----------+----------+-------+

特別是,我想做的是將一種 +- 3 行的 window 應用於列Condition == 1的行(即在這種情況下為第 5 行)。 在那個 window 中,如上面的 DataFrame 所示,我想找到列Value的最小值和列Timestamp的對應值,從而得到:

+----------+----------+
| Min_value| Timestamp|
+----------+----------+
|        44|         7|
+----------+----------+

有誰知道如何解決這個問題?

提前謝謝了

馬里安薩斯

您可以使用跨越前 3 行和后 3 行的 window,獲取最小值並過濾條件:

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'min',
    F.min(
        F.struct('Value', 'Timestamp')
    ).over(Window.partitionBy('ID').orderBy('Timestamp').rowsBetween(-3,3))
).filter('Condition = 1').select('min.*')

df2.show()
+-----+---------+
|Value|Timestamp|
+-----+---------+
|   44|        7|
+-----+---------+

暫無
暫無

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

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