scala - 由于区分大小写,在 Spark 中加载带有模式的 JSON 文件正在加载空数据
问题描述
我正在尝试使用 Schema 加载 JSON 文件,但模式的列都是小写的,并且 JSON 文件中的键不是,所以加载的数据为空。我可以使用推断的架构加载文件,但这不是一个选项。我也尝试过设置 spark.sql.caseSensitive=true
,但它没有工作,而是将它们添加为新列。是否可以设置任何属性以使其工作,或者我必须在加载到 spark 之前预处理所有这些 JSON 文件。JSON 可能缺少键值。例如
{"id": "0001","type": "donut"}
{"Id": "0002","Type": "Cakedonut"}
{"ID": "0002"}
解决方案
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|
+---------+----+
推荐阅读
- django - 我如何在一个引导表 django 2.1 上填充我的数据
- excel - VBA-excel循环文本框
- javascript - 通过使用 javascript 在 HTML 中单击来更改图片服务器的时间
- python - 网页抓取python多个属性(div和id)
- r - 根据可用库存将项目划分为其他 ID
- ruby-on-rails - 如何防止非常相似的 if/else Ruby 代码?
- node.js - 使用节点 js 填充 ObjectId 的数组作为响应
- sql - 将嵌套解码转换为等效的 CASE 语句(需要从 Oracle 转换为 PostgreSQL)
- hadoop - Hive - 将'yyyy-MM-dd'之类的字符串转换为数据类型'yyyy-MM-dd'的日期
- r - R中的克里金函数问题