使用Spark DataFrames查询JSON数据列,但不确定其架构

时间:2017-04-16 15:22:54

标签: json postgresql apache-spark apache-spark-sql

我有这个特殊的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定义,但这个有点层次化!我不明白应该如何定义这个架构! `

1 个答案:

答案 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并且基本上是整个嵌套对象的平面。