转换为 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 字段默认排序的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark Dataframe API 中将出生日期转换为年龄
Spark 类型不匹配:无法从 DataFrame 转换为 Dataset<Row>