我有一张融化的桌子,形状为:
+------+---------+--------------+------------+--------------+
| time | channel | value_double | value_long | value_string |
+------+---------+--------------+------------+--------------+
| 0 | A | 1.1 | null | null |
| 0 | B | null | 1 | null |
| 0 | C | null | null | "foo" |
| 1 | A | 2.1 | null | null |
| 1 | B | null | 2 | null |
| 1 | C | null | null | "bar" |
| 2 | A | 3.1 | null | null |
| 2 | B | null | 3 | null |
| 2 | C | null | null | "foobar" |
+------+---------+--------------+------------+--------------+
我想将这张表调整为:
+------+-----+---+----------+
| time | A | B | C |
+------+-----+---+----------+
| 0 | 1.1 | 1 | "foo" |
| 1 | 2.1 | 2 | "bar" |
| 2 | 3.1 | 3 | "foobar" |
+------+-----+---+----------+
我有一些类似的东西:
df.groupBy("time").pivot("channel").agg(...)
但我正在努力填充
agg
函数以聚合不同的值。我已经尝试过 coalesce
但由于列之间的类型不同,它会遇到错误。
一些要点:
value
列具有不同的类型(double
、long
和 string
)PySpark/SparkSQL 可以实现这一点吗?
同时使用
coalesce
和 first
功能。
from pyspark.sql import functions as F
...
df = df.groupBy('time').pivot('channel').agg(F.first(F.coalesce('value_double', 'value_long', 'value_string')))