Создание структур со значениями столбцов

#apache-spark

#apache-spark

Вопрос:

Я пытаюсь преобразовать свой фрейм данных в JSON, чтобы его можно было вставить в ElasticSearch. Вот как выглядит мой фрейм данных:

 Provider   Market   Avg.  Deviation
XM         NY       10    5
TL         AT       8     6
LM         CA       7     8
 

Я хочу, чтобы это было так:

 Column
XM: {
   NY: {
     Avg: 10,
     Deviation: 5
   }
}
 

Как я могу создать что-то подобное?

Ответ №1:

Проверьте приведенный ниже код, вы можете изменить это в соответствии с вашими требованиями.

 scala> :paste
// Entering paste mode (ctrl-D to finish)

df
.select(
  to_json(
    struct(
      map(
        $"provider",
        map(
          $"market",
          struct($"avg",$"deviation")
          )
        ).as("json_data")
      )
    ).as("data")
)
.select(get_json_object($"data","$.json_data").as("data"))
.show(false)
 

Вывод

  -------------------------------------- 
|data                                  |
 -------------------------------------- 
|{"XM":{"NY":{"avg":10,"deviation":5}}}|
|{"TL":{"AT":{"avg":8,"deviation":6}}} |
|{"LM":{"CA":{"avg":7,"deviation":8}}} |
 -------------------------------------- 
 

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

1. Есть ли способ удалить as («столбец») и просто сделать его {"XM": {...}}

Ответ №2:

В случае, если кто-то хочет, чтобы это было сделано pyspark способом (Spark 2.0 ),

 from pyspark import Row
from pyspark.sql.functions import get_json_object, to_json, struct,create_map

row = Row('Provider', 'Market', 'Avg', 'Deviation')
row_df = spark.createDataFrame(
    [row('XM', 'NY', '10', '5'), 
     row('TL', 'AT', '8', '6'),
     row('LM', 'CA', '7', '8')])
row_df.show()

row_df.select(
  to_json(struct(
      create_map(
          row_df.Provider, 
          create_map(row_df.Market, 
                     struct(row_df.Avg, row_df.Deviation)
                     )
      )
  )
  ).alias("json")
).select(get_json_object('json', '$.col1').alias('json')).show(truncate=False)
 

Вывод:

  -------- ------ --- --------- 
|Provider|Market|Avg|Deviation|
 -------- ------ --- --------- 
|      XM|    NY| 10|        5|
|      TL|    AT|  8|        6|
|      LM|    CA|  7|        8|
 -------- ------ --- --------- 

 ------------------------------------------ 
|json                                      |
 ------------------------------------------ 
|{"XM":{"NY":{"Avg":"10","Deviation":"5"}}}|
|{"TL":{"AT":{"Avg":"8","Deviation":"6"}}} |
|{"LM":{"CA":{"Avg":"7","Deviation":"8"}}} |
 ------------------------------------------