我正在尝试聚合 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|
+---+------+------+
