apache-spark-sql - 如何从 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_parse(auxdata['additional_data']) as 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", "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|
* +---+--------------------------------------------------------------------------------------------------------------------------------------+---------+
*/
推荐阅读
- ios - 如何从Objective c中的WKWebView打开电话,电子邮件,另一个url
- python - 为什么我不能将 publicip.get() 分配给变量?
- javascript - 数组永远不会在 React 中的 render() 之前定义?
- python - PostgreSQL - 用户“postgres”的对等身份验证失败
- python-3.x - 提取以“st”、“nd”、“rd”、“th”结尾的日期,同时使用 RegEx 将日期与月份交换
- react-native - 如何将 csv 文件转换为 db REACT-NATIVE
- python - 如何对 csv 文件进行排序以仅在文件中获取一行?
- node.js - 无法成功将视频上传到 AWS S3
- android - ANDROID - FIREBASE - 不支持序列化集合
- scala - How can I block terminating my program until the Observable consumption is complete?