gpt4 book ai didi

json - Spark JSON 将 JSON 中完整的字段读取到案例类中

转载 作者:行者123 更新时间:2023-12-05 02:56:53 33 4
gpt4 key购买 nike

考虑以下案例类模式,

case class Y (a: String, b: String)
case class X (dummy: String, b: Y)

字段b是可选的,我的一些数据集没有字段b。当我尝试读取不包含的 JSON 字符串时,我收到一个字段丢失异常。

spark.read.json(Seq("{'dummy': '1', 'b': {'a': '1'}}").toDS).as[X]
org.apache.spark.sql.AnalysisException: No such struct field b in a;
at org.apache.spark.sql.catalyst.expressions.ExtractValue$.findField(complexTypeExtractors.scala:85)
at org.apache.spark.sql.catalyst.expressions.ExtractValue$.apply(complexTypeExtractors.scala:53)
at org.apache.spark.sql.catalyst.analysis.Analyzer$$anonfun$resolveExpression$1.applyOrElse(Analyzer.scala:1074)
at org.apache.spark.sql.catalyst.analysis.Analyzer$$anonfun$resolveExpression$1.applyOrElse(Analyzer.scala:1065)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$2.apply(TreeNode.scala:282)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$2.apply(TreeNode.scala:282)
at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)

如何自动将 JSON 中不存在的字段反序列化为 null?

最佳答案

b 字段定义为 Option 类型并使用编码器创建结构类型模式。

  • 使用 .schema 选项和 case class X 传递定义的模式以创建数据集!

示例:

case class Y (a: String, b: Option[String] = None)
case class X (dummy: String, b: Y)

import org.apache.spark.sql.Encoders

val schema = Encoders.product[X].schema

spark.read.schema(schema).json(Seq("{'dummy': '1', 'b': {'a': '1'}}").toDS).as[X].show()

//+-----+----+
//|dummy| b|
//+-----+----+
//| 1|[1,]|
//+-----+----+

从结构类型中选择 b 列:

spark.read.schema(schema).json(Seq("{'dummy': '1', 'b': {'a': '1'}}").toDS).as[X].
select("b.b").show()

//+----+
//| b|
//+----+
//|null|
//+----+

打印模式:

spark.read.schema(schema).json(Seq("{'dummy': '1', 'b': {'a': '1'}}").toDS).as[X].printSchema

//root
//|-- dummy: string (nullable = true)
//|-- b: struct (nullable = true)
//| |-- a: string (nullable = true)
//| |-- b: string (nullable = true)

关于json - Spark JSON 将 JSON 中完整的字段读取到案例类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60049650/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com