создать столбец json из некоторых строк на SQL - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь использовать SQL (Spark SQL 3.0, среда выполнения databricks 7.0) для создания новой таблицы из существующей таблицы. Я хотел бы объединить несколько строк из одного столбца c в столбец json в новой таблице.

Существующая таблица

id,     year,  month, val
u_ced    2002   05    v_scyronc
u_ced    2002   05    v_ytbtbdv
u_ced    2002   05    v_utncasx
u_pny    2005   07    v_opcrgae
u_pny    2005   07    v_wytnecs 

               

Мне нужна новая таблица, например

id,       val_json
u_ced     {{"shown": true, "val_id": "v_scyronc" },
          {"shown": true, "val_id": "v_ytbtbdv" },
          {"shown": true, "val_id": "v_utncasx" },
          {"shown": true, "val_id": "v_opcrgae" },
          {"shown": true, "val_id": "v_wytnecs" }
         }} 

 u_pny    {{"shown": true, "val_id": "v_opcrgae" },
          {"shown": true, "val_id": "v_wytnecs" }              
         }} 

Думаю, мне нужна «группа по», но я не знаю, как создать столбец json.

Я пробовал:

SELECT json_object(array_agg(id), array_agg(val)) 

Но у меня ошибка:

 Error in SQL statement: AnalysisException: Undefined function: 'json_object'. 
  This function is neither a registered temporary function nor a permanent function registered in the database 'default'

Надеюсь, что кто-нибудь может мне в этом помочь.

спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Возможно, это пригодится -


    df.show(false)
    df.printSchema()

    /**
      * +-----+-----+------+---------+
      * |id,  |year,|month,|val      |
      * +-----+-----+------+---------+
      * |u_ced|2002 |5     |v_scyronc|
      * |u_ced|2002 |5     |v_ytbtbdv|
      * |u_ced|2002 |5     |v_utncasx|
      * |u_pny|2005 |7     |v_opcrgae|
      * |u_pny|2005 |7     |v_wytnecs|
      * +-----+-----+------+---------+
      *
      * root
      * |-- id,: string (nullable = true)
      * |-- year,: integer (nullable = true)
      * |-- month,: integer (nullable = true)
      * |-- val: string (nullable = true)
      */

    df.withColumn("shown", lit(true))
      .withColumnRenamed("val", "val_id")
      .withColumn("val_json", struct(col("shown"), col("val_id")))
      .groupBy("id")
      .agg(collect_list("val_json").as("val_json"))
      .select(col("id"), to_json(col("val_json")).as("val_json"))
      .show(false)

    /**
      * +-----+-------------------------------------------------------------------------------------------------------------+
      * |id   | val_json                                                                                      |
      * +-----+-------------------------------------------------------------------------------------------------------------+
      * |u_pny|[{"shown":true,"val_id":"v_opcrgae"},{"shown":true,"val_id":"v_wytnecs"}]                                    |
      * |u_ced|[{"shown":true,"val_id":"v_scyronc"},{"shown":true,"val_id":"v_ytbtbdv"},{"shown":true,"val_id":"v_utncasx"}]|
      * +-----+-------------------------------------------------------------------------------------------------------------+
      */
0 голосов
/ 10 июля 2020

Spark SQL не имеет функции 'json_object'.

см. Это spark sql встроенные функции .

функция to_json, collect_list и concat_ws могут быть полезны.

...