如何解决嵌套 Json 提取中间键未知的值
我在这样的数据框中有一个 Json 列(colJson)
{
"a": "value1","b": "value1","c": true,"details": {
"qgiejfkfk123": { //unknown value
"model1": {
"score": 0.531,"version": "v1"
},"model2": {
"score": 0.840,"version": "v2"
},"other_details": {
"decision": false,"version": "v1"
}
}
}
}
这里的 'qgiejfkfk123' 是动态值,每行都会发生变化。但是我需要提取model1.score 和model2.score。
我试过了
sourceDf.withColumn("model1_score",get_json_object(col("colJson"),"$.details.*.model1.score").cast(DoubleType))
.withColumn("model2_score","$.details.*.model2.score").cast(DoubleType))
但是没有用。
解决方法
我设法通过使用 from_json
获得您的解决方案,将动态值解析为 Map
val schema = "STRUCT<`details`: MAP<STRING,STRUCT<`model1`: STRUCT<`score`: DOUBLE,`version`: STRING>,`model2`: STRUCT<`score`: DOUBLE,`other_details`: STRUCT<`decision`: BOOLEAN,`version`: STRING>>>>"
val fromJsonDf = sourceDf.withColumn("colJson",from_json(col("colJson"),lit(schema)))
val explodeDf = fromJsonDf.select($"*",explode(col("colJson.details")))
// +----------------------------------------------------------+------------+--------------------------------------+
// |colJson |key |value |
// +----------------------------------------------------------+------------+--------------------------------------+
// |{{qgiejfkfk123 -> {{0.531,v1},{0.84,v2},{false,v1}}}}|qgiejfkfk123|{{0.531,v1}}|
// +----------------------------------------------------------+------------+--------------------------------------+
val finalDf = explodeDf.select(col("value.model1.score").as("model1_score"),col("value.model2.score").as("model2_score"))
// +------------+------------+
// |model1_score|model2_score|
// +------------+------------+
// | 0.531| 0.84|
// +------------+------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。