转换为 spark DataFrame 时,Json 字段默认排序

Posted

技术标签:

【中文标题】转换为 spark DataFrame 时,Json 字段默认排序【英文标题】:Json fields getting sorted by default when converted to spark DataFrame 【发布时间】:2016-06-20 12:47:01 【问题描述】:

当我从 json 文件创建数据框时,json 文件中的字段默认在数据框中排序。如何避免这种排序? Jsonfile 每行有一条 json 消息:

"name":"john","age":10,"class":2 "name":"rambo","age":11,"class":3

当我从此文件创建数据框时:val jDF = sqlContext.read.json("/user/inputfiles/sample.json")

DF 被创建为 jDF: org.apache.spark.sql.DataFrame = [age: bigint, class: bigint, name: string] .在 DF 中,字段默认排序。 我们如何避免这种情况发生?

我无法理解这里出了什么问题。

感谢您对解决问题的任何帮助。

【问题讨论】:

每个问题问 一个 问题。 您是说 DF 以与 JSON 不同的顺序结束属性,但 JSON 对象是一个 无序 字段集合; reference。 "a":1,"b":2"b":2,"a":1 完全一样。因此,DF 必须注意的 JSON 中没有“顺序”。 (对DF一无所知,所以不知道有没有顺序。) 感谢@T.J.Crowder 的回复。我必须按照与源 json 相同的顺序创建一个列顺序的表。所以,数据框中 json 属性的排序让我很困扰。 我明白了。但同样:JSON 对象没有没有顺序。即使您在现在中以特定顺序获取它们,也不能保证生成它们的任何东西都不会突然改变该顺序(即使在 JSON 序列化程序的次要版本之间)用途)。所以给你的要求是没有意义的。您需要更改 JSON 提要以向您发送一个数组。 【参考方案1】:

对于问题 1:

一个简单的方法是在DataFrame上做select

val newDF = jDF.select("name","age","class")

参数的顺序就是你想要的列的顺序。

但是如果有很多列并且您必须自己定义顺序,这可能会很冗长。

【讨论】:

以上是关于转换为 spark DataFrame 时,Json 字段默认排序的主要内容,如果未能解决你的问题,请参考以下文章

SparkSQL

在 Spark Dataframe API 中将出生日期转换为年龄

Spark RDD转换成DataFrame的两种方式

Spark 类型不匹配:无法从 DataFrame 转换为 Dataset<Row>

如何在 Spark Streaming 中将 RDD 转换为 DataFrame,而不仅仅是 Spark

将 RDD 转换为 Dataframe Spark