如何在pyspark Dataframe groupby对象中对多个字符串列进行聚合?

atmip9wb  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(180)

我有一个pyspark Dataframe ,其中包含许多 stringdouble 类型的列,格式如下:

+---+---+--------+-----+------+----+
|tin|ecu|DcyStart|did1 |did2  |did3|
+---+---+--------+-----+------+----+
|1  |1  |1       |34   |null  |null|
|1  |1  |2       |null |2     |null|
|1  |1  |3       |null |null  |b   |
|1  |1  |4       |null |null  |null|
|1  |2  |1       |40   |null  |null|
|1  |2  |2       |null |2     |null|
|1  |2  |3       |null |null  |f   |
|1  |2  |4       |null |null  |null|
+---+---+--------+----+-------+----+

其中每个 did-列应该只在具有特定 DcyStart 值的行中具有值。我对DcyStart中的信息不感兴趣,我希望删除它以减少表大小并消除空条目。
我尝试对 tinecu 进行分组,然后使用不同的函数(如first()max()等)聚合 DcyStart 范围内的所有 did 列,但这些函数失败的原因有两个:

  • agg函数无法处理 * 字符串 *
  • agg函数只能将一列作为参数

我已经尝试了以下代码的几种变体:

list_of_dids = ["did1", "did2", "did3"]
data.groupBy("tin", "ecu").first(*list_of_dids)

但它总是给我上面列出的两个错误之一。
有100多个不同的 did-列,其中一些列可能有多个 DcyStart 的值,但如果是这种情况,它们中的任何一个都可以用于“聚合”。
我想实现的是:

+---+----+-----+----+----+
|tin|ecu||did1 |did2|did3|
+---+----+-----+----+----+
|1  |1   |34   |2   |b   |
|1  |2   |40   |2   |f   |
+---+----+-----+----+----+

我该怎么解决这个问题?o_O

qpgpyjmq

qpgpyjmq1#

list_of_dids = ["did1", "did2", "did3"]
from pyspark.sql.functions import first, max
list(map(lambda x: max(x), list_of_dids))
df.groupBy("tin", "ecu").agg(*list(map(lambda x: max(x), list_of_dids))).show()

尝试使用这个. groupBy().agg(),您可以在一次运行中执行多个聚合。

相关问题