Skip to main content
 首页 » 编程设计

python之返回具有 pyspark GroupedData 中最佳字段的行

2024年08月15日32lovecherry

我正在尝试聚合 GroupedData对象变成 Row具有最好的属性(不是 None 或最高的 timestamp )对于 Dataframe喜欢:

╔═══════╦═══════════╦════════╦════════╦════════╗ 
║ group ║ timestamp ║ value1 ║ value2 ║ value3 ║ 
╠═══════╬═══════════╬════════╬════════╬════════╣ 
║ a     ║       111 ║ None   ║ None   ║ None   ║ 
║ a     ║       222 ║ a      ║ None   ║ None   ║ 
║ a     ║       333 ║ b      ║ 1      ║ 1.1    ║ 
║ a     ║       444 ║ None   ║ None   ║ 2.2    ║ 
║ b     ║       111 ║ c      ║ None   ║ 3.3    ║ 
╚═══════╩═══════════╩════════╩════════╩════════╝ 

我想要一个结果Dataframe喜欢:

╔═══════╦═══════════╦════════╦════════╦════════╗ 
║ group ║ timestamp ║ value1 ║ value2 ║ value3 ║ 
╠═══════╬═══════════╬════════╬════════╬════════╣ 
║ a     ║       444 ║ b      ║ 1      ║ 2.2    ║ 
║ b     ║       111 ║ c      ║ None   ║ 3.3    ║ 
╚═══════╩═══════════╩════════╩════════╩════════╝ 

理想情况下,我想创建一个不同的逻辑来聚合每一列。例如min对于 timestamp但是max对于 value3 .

这在 Dataframe 中可能吗?是吗?

谢谢,

请您参考如下方法:

SparkSQL 实际上会完全按照您的意愿执行操作,并在聚合列时忽略空值。例如,让我们考虑以下数据框:

df = sc.parallelize([("a", 1, None), ("b", None, 5), ("a", 2, None), ("b", 0, 7)]).toDF(["A", "B", "C"]) 

看起来像这样:

+---+----+----+ 
|  A|   B|   C| 
+---+----+----+ 
|  a|   1|null| 
|  b|null|   5| 
|  a|   2|null| 
|  b|   0|   7| 
+---+----+----+ 

您可以像这样使用不同的函数进行聚合:

import pyspark.sql.functions as F 
df.groupBy("A").agg(F.min(F.col("B")), F.max(F.col("C") )) 

并得到你所期望的(当这是唯一的值时忽略空值期望,以及不同的聚合器函数):

+---+------+------+ 
|  A|min(B)|max(C)| 
+---+------+------+ 
|  b|     0|     7| 
|  a|     1|  null| 
+---+------+------+