我有这个特殊的JSON文件,它是PostgreSQL生成的日志。我将这个JSON文件从多行格式转换为单行格式。在我解析的Dataframe中的一个字段中有一个String Column。此字符串列本身采用JSON格式,此示例为:
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "671.64"
},
"ordering_operation": {
"using_filesort": true,
"cost_info": {
"sort_cost": "100.00"
},
"table": {
"table_name": "test1",
"access_type": "range",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"id"
],
"key_length": "4",
"rows_examined_per_scan": 100,
"rows_produced_per_join": 100,
"filtered": "100.00",
"cost_info": {
"read_cost": "21.64",
"eval_cost": "20.00",
"prefix_cost": "41.64",
"data_read_per_join": "18K"
},
"used_columns": [
"id",
"c"
],
"attached_condition": "(`proxydemo`.`test1`.`id` between 501747 and <cache>((504767 + 99)))"
}
}
}
}
我知道在Spark 2.0+中我可以使用
from_json(e:Column,schema:StructType):Column
来自SparkSQL函数的函数。但我不确定该String的架构应该是什么。我已经做了很多架构和StructType定义,但这个有点层次化!我不明白应该如何定义这个架构! `
答案 0 :(得分:0)
我发现了嵌套模式的工作原理。
在这个特定的示例中,模式如下:
对象的根目录:
val query_block_schema = (new StructType)
.add("select_id", LongType)
.add("cost_info", StringType)
.add("ordering_operation", StringType)
对于第二层:
val query_plan_schema = (new StructType)
.add("query_block", StringType)
依旧......
所以我认为这个问题已经解决了。稍后,我将所有这些合并在一起,以防它们不是null并且基本上是整个嵌套对象的平面。