Преобразуйте столбец фрейма данных Spark с разделом строки во вложенный Json с помощью динамической схемы Json

#java #json #scala #apache-spark #apache-spark-sql

Вопрос:

У меня есть проблема,в которой я должен создать вложенный json, который будет храниться в redis, а затем передаваться в пользовательский интерфейс через службу rest, где он будет использоваться для построения диаграммы солнечных лучей.

Пример Json прилагается ниже

Проблема с созданием вложенных JSON-это что,для JSON-объект (где категория cat_a) внутри JSON в массив, который я могу иметь глубину с размер Н , который не известен заранее и тем же ключом (дети в моем случае) в другой объект JSON (где категория cat_b) массива глубина — метров.

Мой фрейм данных выглядит следующим образом.

  ---------------- ---------------- ---------------- 
|Category        |EventSeq        |Count           |
 ---------------- ---------------- ---------------- 
|cat_a           |[A]             |30              |
|cat_a           |[A,B]           |20              |
|cat_a           |[A,B,C]         |5               |
|cat_a           |[A,W]           |4               |
|cat_a           |[C]             |30              |
|cat_a           |[C,A]           |20              |
|cat_a           |[C,A,B]         |5               |
|cat_b           |[X]             |30              |
|cat_b           |[X,Y]           |20              |
|cat_b           |[X,Y,Z]         |5               |
|cat_b           |[Z]             |30              |
|cat_b           |[Z,X]           |20              |
 ---------------- ---------------- ---------------- 
 

Теперь я хочу преобразовать этот фрейм данных во вложенный Json следующим образом:

 [
   {
      "category":"cat_a",
      "children":[
         {
            "name":"A",
            "count":30,
            "children":[
               {
                  "name":"B",
                  "count":20,
                  "children":[
                     {
                        "name":"C",
                        "count":5
                     }
                  ]
               },
               {
                  "name":"W",
                  "count":4
               }
            ]
         },
         {
            "name":"C",
            "count":30,
            "children":[
               {
                  "name":"A",
                  "count":20,
                  "children":[
                     {
                        "name":"B",
                        "count":5
                     }
                  ]
               }
            ]
         }
      ]
   },
   {
      "category":"cat_b",
      "children":[
         {
            "name":"X",
            "count":30,
            "children":[
               {
                  "name":"Y",
                  "count":20,
                  "children":[
                     {
                        "name":"Z",
                        "count":5
                     }
                  ]
               }
            ]
         },
         {
            "name":"Z",
            "count":30,
            "children":[
               {
                  "name":"X",
                  "count":20
               }
            ]
         }
      ]
   }
]
 

Я не знаю, возможно ли это вообще в spark с scala или нет.
Если нет, то можно ли это сделать на уровне обслуживания Rest?

Комментарии:

1. версия spark ??

2. как насчет этих |cat_a |[A,W] |4 | данных, они недоступны в вашем образце json ?

3. @Srinivas spark версия 2.4.[A,W] представлена как ребенок, у которого W параллельно B

Ответ №1:

В Lettuce redis, когда мы получаем данные, соответствующие ключу, есть команда

 template.opsForZSet().reverseRangeByScore(K key, double min, double max);
 

таким образом, вы можете достичь, используя это

Комментарии:

1. Это не проблема redis. Это скорее вопрос о том, как преобразовать данный фрейм данных spark в Json.