Spark: создать группу JSON по идентификатору - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть dataFrame unionDataDF с образцами данных

+---+------------------+----+
| id|              data| key|
+---+------------------+----+
|  1|[{"data":"data1"}]|key1|
|  2|[{"data":"data2"}]|key1|
|  1|[{"data":"data1"}]|key2|
|  2|[{"data":"data2"}]|key2|
+---+------------------+----+

, где id - это IntType, data - это JsonType и ключ - StringType.

Я хочу отправлять данные по сети для каждого идентификатора.Например, выходные данные для id"1" имеют вид:

{
    "id": 1,
    "data": {
        "key1": [{
            "data": "data1"
        }],
        "key2": [{
            "data": "data1"
        }]
    }
}

Как я могу сделать то же самое?

Пример кода для создания unionDataDF

val dummyDataDF= Seq((1, "data1"), (2, "data2")).toDF("id", "data");
val key1JsonDataDF = dummyDataDF.withColumn("data", to_json(struct( $"data"))).groupBy("id").agg(collect_list($"data").alias("data")).withColumn("key", lit("key1"))
val key2JsonDataDF = dummyDataDF.withColumn("data", to_json(struct( $"data"))).groupBy("id").agg(collect_list($"data").alias("data")).withColumn("key", lit("key2"))
val unionDataDF = key1JsonDataDF.union(key2JsonDataDF)

Версия:

Spark: 2.2
Scala: 2.11

1 Ответ

0 голосов
/ 03 апреля 2019

Что-то вроде

unionDataDF
  .groupBy("id")
  .agg(collect_list(struct("key", "data")).alias("grouped"))
  .show(10, false)

выход:

+---+--------------------------------------------------------+
|id |grouped                                                 |
+---+--------------------------------------------------------+
|1  |[[key1, [{"data":"data1"}]], [key2, [{"data":"data1"}]]]|
|2  |[[key1, [{"data":"data2"}]], [key2, [{"data":"data2"}]]]|
+---+--------------------------------------------------------+

...