Как я могу извлечь значение из двойной вложенной карты в SparkSQL?

#apache-spark-sql #nested

#apache-spark-sql #вложенный

Вопрос:

Я пытаюсь получить доступ к столбцу (называемому auxdata) в SparkSQL, который выглядит следующим образом:

{«data_type»: «2», «additional_data»: «»{«session_id»: «102s», «from_user_id»: kkk0000, «object_id»: «aaaa68764″}»»}

Я хотел бы извлечь object_id из «additional_data».

В Presto я смог сделать это как:

выберите json_extract_scalar(json_parse(cast(json_parse(auxdata[‘additional_data’]) как varchar)), ‘$.object_id’) как obj_id из таблицы

Есть ли какой-либо способ сделать это в SparkSQL?

Я пытался:

выберите get_json_object(element_at(auxdata, ‘additional_data’), ‘$.object_id’) в качестве obj_id из таблицы

но оно возвращает значение null.

Заранее благодарю вас за любой совет!

Ответ №1:

Я думаю, что предоставленный вами json неверен. Я изменил его в примере ниже. Вы можете использовать nested get_json_object для анализа вложенного json-

    val data =
      """
        |{"data_type":"2", "additional_data": "{"session_id": "102s", "from_user_id": "kkk0000","object_id": "aaaa68764"}"}
      """.stripMargin
    val df = spark.range(1).withColumn("auxdata", lit(data))
    df.show(false)
    df.printSchema()

    /**
      *  --- --------------------------------------------------------------------------------------------------------------------------------------- 
      * |id |auxdata                                                                                                                                |
      *  --- --------------------------------------------------------------------------------------------------------------------------------------- 
      * |0  |
      * {"data_type":"2", "additional_data": "{"session_id": "102s", "from_user_id": "kkk0000",
      * "object_id": "aaaa68764"}"}
      * |
      *  --- --------------------------------------------------------------------------------------------------------------------------------------- 
      *
      * root
      * |-- id: long (nullable = false)
      * |-- auxdata: string (nullable = false)
      */

    df.withColumn("obj_id", get_json_object(get_json_object($"auxdata", "$.additional_data"), "$.object_id"))
      .show(false)

    /**
      *  --- -------------------------------------------------------------------------------------------------------------------------------------- --------- 
      * |id |auxdata                                                                                                                               |obj_id   |
      *  --- -------------------------------------------------------------------------------------------------------------------------------------- --------- 
      * |0  |
      * {"data_type":"2", "additional_data": "{"session_id": "102s", "from_user_id": "kkk0000","object_id": "aaaa68764"}"}
      * |aaaa68764|
      *  --- -------------------------------------------------------------------------------------------------------------------------------------- --------- 
      */