PySpark Dataframe.groupBy MapType列

时间:2016-03-16 16:23:52

标签: python apache-spark pyspark apache-spark-sql

我有一个带有MapType列的数据框,其中键是一个id,值是另一个带有两个数字,一个计数器和一个收入的StructType。

看起来像是:

SELECT b1.* 
FROM bands AS b1
JOIN bands AS b2 ON b1.genre = b2.genre
WHERE b2.name = 'Deep Purple'

现在我需要为每个id总结这两个值,结果将是:

+--------------------------------------+
| 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]) |
+--------------------------------------+

我实际上不知道该怎么做,也找不到这个特例的文档。我尝试使用Dataframe.groupBy但无法使其工作:(

有什么想法吗?

我正在使用Spark 1.5.2和Python 2.6.6

1 个答案:

答案 0 :(得分:3)

假设架构等同于:

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")))