如何解决如何在SparkSQL中从双嵌套映射中提取值?
我正在尝试访问如下所示的SparkSQL中的列(称为auxdata):
{“ data_type”:“ 2”,“ additional_data”:“” {\“ session_id \”:\“ 102s \”,\“ from_user_id \”:kkk0000,\“ object_id \”:\“ aaaa68764 \” }“”}
我想在“ additional_data”中提取object_id。
在Presto中,我可以这样做:
选择json_extract_scalar(json_parse(cast(json(pars_parse(auxdata ['additional_data']))作为varchar)),'$ .object_id')作为obj_id 从表中
SparkSQL是否有任何方法可以做到这一点?
我尝试过:
选择get_json_object(element_at(auxdata,'additional_data'),'$ .object_id')作为obj_id 从表中
但它返回null。
预先感谢您的任何建议!
解决方法
我认为您提供的json不正确。我在以下示例中对其进行了修改。您可以使用嵌套的 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",* \"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",\"object_id\": \"aaaa68764\"}"}
* |aaaa68764|
* +---+--------------------------------------------------------------------------------------------------------------------------------------+---------+
*/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。