在 Spark DataFrame 上保存到 JSON 并重新加载,模式列序列发生变化

Posted

技术标签:

【中文标题】在 Spark DataFrame 上保存到 JSON 并重新加载,模式列序列发生变化【英文标题】:On Spark DataFrame save to JSON and load back, schema column sequence changes 【发布时间】:2016-01-08 03:37:03 【问题描述】:

我正在使用 spark DataFrames 并尝试对相同架构的 DataFrames 进行重复数据删除。

将 DataFrame 保存为 JSON 之前的模式如下:

root
 |-- startTime: long (nullable = false)
 |-- name: string (nullable = true)

从 JSON 文件加载后的 DataFrame 架构如下:

root
 |-- name: string (nullable = true)
 |-- startTime: long (nullable = false)

我将 JSON 保存为:

newDF.write.json(filePath)

回读为:

existingDF = sqlContext.read.json(filePath)

unionAll 之后

existingDF.unionAll(newDF).distinct()

或除外

newDF.except(existingDF)

由于架构更改,重复数据删除失败。

我可以避免这种架构转换吗? 有没有办法在保存到 JSON 文件和从 JSON 文件加载回时保存(或强制执行)模式序列?

【问题讨论】:

【参考方案1】:

实施了一种解决方法,将架构转换回我需要的:

val newSchema = StructType(jsonDF.schema.map 
  case StructField(name, dataType, nullable, metadata) if name.equals("startTime") => StructField(name, LongType, nullable = false, metadata)
  case y: StructField => y
)
existingDF = sqlContext.createDataFrame(jsonDF.rdd, newSchema).select("startTime", "name")

【讨论】:

以上是关于在 Spark DataFrame 上保存到 JSON 并重新加载,模式列序列发生变化的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 DBFS 上将 Spark Dataframe 以 CSV 格式保存到磁盘

Spark DataFrame 到 Avro 并将 AVRO 文件保存到 Cassandra 表

将 Spark Dataframe 中的每一行保存到不同的文件中

spark DataFrame 读写和保存数据

Spark SQL数据加载和保存实战

Spark SQL数据载入和保存实战