#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|
* --- -------------------------------------------------------------------------------------------------------------------------------------- ---------
*/