当前位置: 首页 > 知识库问答 >
问题:

显式指定用于读取JSON的模式,并将缺少的字段标记为null[重复]

钱建本
2023-03-14

我正在生成一个数据集

DataSet<Person> personDs = sparkSession.read().json("people.json").as(Encoders.bean(Person.class));

其中人员

class Person {
    private String name;
    private String placeOfBirth;

    //Getters and setters
    ...
}

如果我的输入数据只包含一个名称({"name":"bob"}),我得到一个错误org.apache.spark.sql.Analysis Exception:无法解决'place OfBirth'给定的输入列:[name]

我有没有办法告诉Spark,出生地点(或任何其他字段)可以是null?

共有1个答案

万俟浩
2023-03-14

在Spark 2.3.0和Scala 2.11.12中,该代码对我有效:

sparkSession.read.schema("name String, placeOfBirth String").json("people.json").as(Encoders.bean(classOf[Person])).show()

输出:

+----+------------+
|name|placeOfBirth|
+----+------------+
| bob|        null|
+----+------------+
 类似资料:
  • 我正在尝试为我正在构建的Java(JAX-RS)Web服务实现JSON合并补丁。 要点是通过向服务器发送一个JSON文档来完成记录的部分更新,该文档只包含应该更改的字段。 鉴于此记录 ,以下JSON更新文档 应该为设置一个新值并删除中的。 后者才是问题所在。我不知道如何区分缺少f的输入和f为null的输入。据我所知,这两个都将在目标Java对象中反序列化为null。 做什么?

  • 问题内容: 我想知道模式草案03是否可行。我已经在其他地方使用了依赖项,我认为可能需要创造性地使用它们,以便使用它们来指定某些字段的属性。 我目前的最佳尝试(无效)将使您对我的追求有所了解。我想要一个默认值,当另一个字段具有特定值时是可选值。 问题答案: 草案的第3版绝对可以做到这一点。由于您具有允许的国家/地区的完整列表,因此您可以执行以下操作: 因此,您实际上为架构定义了两种子类型,一种用于需

  • 是否可以定义一次regex并重用它?我有几个非常复杂的正则表达式,我想将它们用作模式,用于模式中各种不同对象的大量属性的值。复制粘贴这个看起来像是自找麻烦,但我似乎找不到合适的重用示例。 删去说明我想做什么的模式。 在http://www.jsonschemavalidator.net/中不进行验证,因为“pattern”不是字符串。这是一个重复使用的洞吗。我看过patternProperties

  • 假设我有类似的模式 这些都不是必需的。用户可以向我发送上述任何属性,但没有其他未声明的属性。他们可以传给我,和或全部。但是如果他们向我传递了所有属性和附加属性,如,则应拒绝该消息。 我如何定义这样的模式?

  • 我是否遗漏了一些简单的东西,比如为类型提供一个数组?例如; 另外,有没有人比json-schema.org更好的JSON模式详细信息来源?我在哪里可以找到更多的例子选择?我不想阅读一个很大的文档/规范来找到可以在10行示例中轻松演示的东西。

  • 我正面临一个与下面显示的代码的问题。下面的代码生成json,如下所示: [{“id”:123,“科目”:“英语”},{“id”:456,“科目”:“数学”}] 我们可以看到生成的JSON中缺少name标记。我不明白当我返回Student列表时,结果的json应该包含name标记,因为Student类中有一个类型为“name”的属性。请救命! 学生豆类: 命名Bean类: