gpt4 book ai didi

scala - Spark 无法写入然后读取具有可为空列的 JSON 格式数据

转载 作者:行者123 更新时间:2023-12-04 17:41:09 26 4
gpt4 key购买 nike

我正在尝试用一个新项目设置 spark,我有一些案例类是从我公司其他地方的模式生成的,我想用作模板以各种格式(parquet 和 json)读/写

我注意到 json 中的一个问题与我们的一个字段有关,它是一个 Option[String]。对应的数据通常为空,但有时也不是。当我测试此数据的子集时,很可能此列中的所有行都为空。 Spark 似乎检测到了这一点,并省略了该数据为空的任何行的列。

当我阅读时,只要任何一行都有相应的数据,spark 就会选择模式并将其转换回案例类。但如果它们都不存在,spark 会发现缺少列并失败。

下面是一些演示这一点的代码。

import org.apache.spark.sql.SparkSession

object TestNulls {
case class Test(str: Option[String])
def main(args: Array[String]) {
val spark: SparkSession = SparkSession
.builder()
.getOrCreate()
import spark.implicits._

val dataset = Seq(
Test(None),
Test(None),
Test(None)
).toDS()

// Because all rows are null, writes {} for all rows
dataset.write.json("testpath")

// Fails because column `test` does not exist, even though it is an option
spark.read.json("testpath").as[Test].show()
}
}

有没有办法告诉 spark 不要在缺少的可为 null 的列上失败?如果做不到这一点,是否有一种我可以使用的人类可读格式不会表现出这种行为? json主要是为了我们可以编写人类可读的文件用于测试和本地开发案例

最佳答案

可以使用case类从Encoder中提取schema,然后在读取时传递

val schema = implicitly[Encoder[Test]].schema
spark.read.schema(schema).json("testpath")

关于scala - Spark 无法写入然后读取具有可为空列的 JSON 格式数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042632/

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