Как конвертировать rdd в вложенный json в pyspark - PullRequest
0 голосов
/ 04 апреля 2019

Я новичок и у меня есть данные в следующем формате

Категория, Подкатегория, Имя

Food,Thai,Restaurant A
Food,Thai,Restaurant B
Food, Chinese, Restaurant C
Lodging, Hotel, Hotel A

Я хочу, чтобы данные были в следующем формате

{Category : Food , Subcategories : [ {subcategory : Thai , names : [Restaurant A , Restaurant B] }, {subcategory : Chinese , names : [Restaurant C]}]}

{Category : Hotel , Subcategories : [ {subcategory : Lodging , names : [Hotel A] }]}

Может кто-нибудь помочь мне, как решить эту проблему с помощью pyspark RDD?

Спасибо!

1 Ответ

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

Вот полезное решение:

создать оконную функцию для сбора имен groupBy Категория и подкатегория

  from pyspark.sql import functions as F
  from pyspark.sql import Window

  groupByCateWind = Window.partitionBy("Category", "Subcategory")

    finalDf = df.withColumn("names", F.collect_list("Name").over(groupByCateWind)) \
        .withColumn("Subcategories", F.struct("Subcategory", "names")) \
        .groupBy("Category").agg(F.collect_set("Subcategories").alias("Subcategories")).toJSON()
  1. собрать имена groupBy над оконной функцией

  2. создать столбец «Подкатегории» с типом структуры, используя столбцы «Подкатегория» и «Имена».

  3. Снова выполнить группирование по категории и собрать значения столбцов «Подкатегория».

Вывод, как показано ниже:

+---------------------------------------------------------------------------------------------------------------------------------------------------------+
|{"Category":"Food","Subcategories":[{"Subcategory":"Thai","names":["Restaurant A","Restaurant B"]},{"Subcategory":" Chinese","names":[" Restaurant C"]}]}|
|{"Category":"Lodging","Subcategories":[{"Subcategory":" Hotel","names":[" Hotel A"]}]}                                                                   |
+---------------------------------------------------------------------------------------------------------------------------------------------------------+
...