【问题标题】:Select fields thats not exist in JSON Spark-Json Dataset选择 JSON Spark-Json 数据集中不存在的字段
【发布时间】:2018-12-31 01:06:45
【问题描述】:

我正在使用 Java-Spark,我的 JSON 看起来像这样:

{
      "name": "myname",
       "age":"35"
}

或者:

{
    "name": "myname",
    "age":"35",
    "country":"US"
}

我读给Dataset的内容如下:

Dataset<Row> df = sparkSession.read().json(jsonSet);
Dataset<Row> dfSelect = df.select(cols);//Where cols is Column[]

数组cols 包含列name、age 和country,但有时JSON 不包含country 字段并且df.select(cols) 会引发异常。

即使 JSON 文件中不存在该字段,如何选择所有字段?

【问题讨论】:

  • 您可以尝试在读取 json 时定义静态架构。

标签: java json apache-spark dataset apache-spark-sql


【解决方案1】:

正如 philantrovert 在评论中所建议的,您可以在读取 json 文件时使用预定义的架构。如果 json 文件中不存在该列,则所有值都将是 null。它可以在Java中完成如下:

List<StructField> fields = new ArrayList<>();
fields.add(DataTypes.createStructField("name", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("age", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("country", DataTypes.StringType, true));
StructType schema = DataTypes.createStructType(fields);

Dataset<Row> df = sparkSession.read().schema(schema).json(jsonSet);

可以在架构中根据需要更改列数据类型。由于df 已包含所需的列,因此无需在之后对列执行select。

【讨论】:

  • @YaKo:对于嵌套列,您仍然必须使用select 或withColumn 来展平数据框架构。在这种情况下应该如何创建模式的示例可以在这里看到:stackoverflow.com/questions/45315784/…
  • 在我创建了架构之后,当我进行 select(cols) 时仍然会抛出异常,因为它找不到该列
  • @YaKo:如果您有嵌套的 JSON(如您的评论所示),则需要在阅读时提供嵌套模式。您可以尝试在选择之前使用printSchema() 来检查所有列是否都存在吗?
  • @Shido,谢谢!!
  • @YaKo:没问题,乐于助人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多