首页 > 解决方案 > 由于区分大小写,在 Spark 中加载带有模式的 JSON 文件正在加载空数据

问题描述

我正在尝试使用 Schema 加载 JSON 文件,但模式的列都是小写的,并且 JSON 文件中的键不是,所以加载的数据为空。我可以使用推断的架构加载文件,但这不是一个选项。我也尝试过设置 spark.sql.caseSensitive=true,但它没有工作,而是将它们添加为新列。是否可以设置任何属性以使其工作,或者我必须在加载到 spark 之前预处理所有这些 JSON 文件。JSON 可能缺少键值。例如

{"id": "0001","type": "donut"} {"Id": "0002","Type": "Cakedonut"} {"ID": "0002"}

标签: scalaapache-spark

解决方案


AFAIK 没有可以结合您的架构的隐式设置,将其视为 Spark 的一项功能,您可以使用下面的代码来实现您的目标。

val spark = SparkSession.builder().master("local[*]").getOrCreate()
    spark.conf.set("spark.sql.caseSensitive","true")
    val df = spark.read.json("src/main/resources/test.json")

    val finalColumns = df.columns.groupBy(_.toLowerCase)
      .map(t => functions.coalesce(t._2.map(col):_*).as(t._1))
      .toArray
    df.select(finalColumns: _*).show()
+---------+----+
|     type|  id|
+---------+----+
|    donut|0001|
|Cakedonut|0002|
|     null|0002|
+---------+----+

推荐阅读