在 pyspark 中旋转时跨不同类型的多个列进行聚合

问题描述 投票:0回答:1

我有一张融化的桌子,形状为:


+------+---------+--------------+------------+--------------+
| 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 可以实现这一点吗?

pyspark apache-spark-sql
1个回答
0
投票

同时使用

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')))
© www.soinside.com 2019 - 2024. All rights reserved.