2016-03-16 3 views
3

У меня есть dataframe с столбцом MapType, где ключ является идентификатором, а значением является другой StructType с двумя номерами, счетчиком и выручкой.PySpark Dataframe.groupBy MapType column

Похоже, что:

+--------------------------------------+ 
| 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 | count | revenue | 
+----------------------+ 
| 1 | 8  | 9.6  | 
| 2 | 7  | 103.06 | 
+----------------------+ 

Я на самом деле не имеют ни малейшего представления о том, как сделать это и не удалось найти документацию для этого особого случая. Я попытался с помощью Dataframe.groupBy, но не мог заставить его работать :(

Есть идеи?

Я использую искровой-1.5.2 с питона-2.6.6

ответ

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

Спасибо большое! взорваться - именно то, что я искал, но не нашел его сам. Я каждый раз ожидал, что он будет работать как 'df.myMapColumn.key'' df.myMapColumn.value', но id не –

+0

@ mabe.berlin Вы также можете проверить http://stackoverflow.com/a/33850490/1560062:) – zero323

Смежные вопросы