PySpark数据框按MapType列分组

4
我有一个数据框,其中包含一个MapType列,键是一个id,值是另一个StructType,包含两个数字,一个计数器和一个收入。
它看起来像这样:
+--------------------------------------+
| myMapColumn                          |
+--------------------------------------+
| Map(1 -> [1, 4.0], 2 -> [1, 1.5])    |
| Map()                                |
| Map(1 -> [3, 5.5])                   |
| Map(1 -> [4, 0.1], 2 -> [6, 101.56]) |
+--------------------------------------+

现在我需要按id汇总这两个值,结果如下:
+----------------------+
| id | count | revenue |
+----------------------+
| 1  | 8     | 9.6     |
| 2  | 7     | 103.06  |
+----------------------+

我其实不知道如何做这个,并且找不到这种特殊情况的文档。我尝试使用Dataframe.groupBy,但是无法让它工作:(
有任何想法吗?
我正在使用Spark 1.5.2和Python 2.6.6
1个回答

4
假设架构等同于以下内容:
root
 |-- myMapColumn: map (nullable = true)
 |    |-- key: integer
 |    |-- value: struct (valueContainsNull = true)
 |    |    |-- _1: integer (nullable = false)
 |    |    |-- _2: double (nullable = false)

你只需要使用 explode 和一个简单的聚合:

from pyspark.sql.functions import col, explode, sum as sum_

(df
  .select(explode(col("myMapColumn")))
  .groupBy(col("key").alias("id"))
  .agg(sum_("value._1").alias("count"), sum_("value._2").alias("revenue")))

非常感谢!explode正是我在寻找但自己没有找到的。我一直以为它能够像df.myMapColumn.key df.myMapColumn.value这样工作,但事实并非如此。 - mabe.berlin
@mabe.berlin 你也可以查看 https://dev59.com/PV4c5IYBdhLWcg3wFW6N#33850490 :) - zero323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接