Spark DataFrame объединяет несколько столбцов в один столбец в виде строки - PullRequest
0 голосов
/ 17 мая 2018

Я хочу преобразовать Spark DataFrame в другой DataFrame определенным образом следующим образом:

У меня есть Spark DataFrame:

+---------+------------+
|protocol |   count    |
+---------+------------+
|      TCP|    8231    |
|     ICMP|    7314    |
|      UDP|    5523    |
|     IGMP|    4423    |
|      EGP|    2331    |
+---------+------------+

И я хочу превратить это в:

+----------------------------------------------------------+
|Aggregated                                                |
+----------------------------------------------------------+
|{tcp: 8231, icmp: 7314, udp: 5523, igmp: 4423, egp: 2331} |
+----------------------------------------------------------+

Агрегированный столбец может быть как списком, так и картой или строкой. Возможно ли это с функциями DataFrame или мне нужно создать свой собственный udf для агрегирования этого?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Поскольку вы хотите преобразовать все столбцы в один, а столбцов с самого начала не так много, вы можете collect передать кадр данных драйверу и использовать чистый код Scala для преобразования его в нужный формат. .

Следующее даст вам Array[String]:

val res = df.as[(String, Int)].collect.map{case(protocol, count) => protocol + ": " + count}

Чтобы преобразовать его в одну строку, просто выполните:

val str = res.mkString("{", ", ", "}")
0 голосов
/ 17 мая 2018

pivot и toJSON дадут вам то, что вам нужно

import org.apache.spark.sql.functions.first

df.groupBy().pivot("protocol").agg(first("count")).toJSON.show(false)
// +----------------------------------------------------------+                    
// |value                                                     |
// +----------------------------------------------------------+
// |{"EGP":2331,"ICMP":7314,"IGMP":4423,"TCP":8321,"UDP":5523}|
// +----------------------------------------------------------+
0 голосов
/ 17 мая 2018

Concat столбцов в фрейме данных и создание нового столбца:

var new_df = df.withColumn("concat", concat($"protocol", lit(" : "), $"count"))

Чтобы объединить его в одну строку в виде списка, вы можете сделать это.

var new_df = new_df.groupBy().agg(collect_list("concat").as("aggregated"))
new_df.show

Если вы хотите получить данные в строку вместо фрейма данных, вы можете собрать их следующим образом.

new_df.select("concat").collect.map(x=> x.get(0)).mkString("{", ",", "}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...