如何维护DataFrame中的键值的顺序与JSON相同?

如何维护DataFrame中的键值的顺序与JSON相同?

问题描述:

样品JSON数据:如何维护DataFrame中的键值的顺序与JSON相同?

{ “名称”: “dev的”, “工资”:100, “职业”: “ENGG”, “地址”: “诺依”}

{“名“: ”KARTHIK“,” 工资 “:200,” 职业 “: ”ENGG“,” 地址“: ”布洛尔“}

星火Java代码:

DataFrame df = sqlContext.read().json(jsonPath); 
df.printSchema(); 
df.show(false); 

输出:

root 
|-- address: string (nullable = true) 
|-- name: string (nullable = true) 
|-- occupation: string (nullable = true) 
|-- salary: long (nullable = true) 


+-------+-------+----------+------+ 
|address|name |occupation|salary| 
+-------+-------+----------+------+ 
|noida |dev |engg  |10000 | 
|blore |karthik|engg  |20000 | 
+-------+-------+----------+------+ 

列按字母顺序排列。 有什么办法维持自然秩序?

+0

我想你可以通过选择来做到这一点,正如这个问题的答案所示http://*.com/questions/35556146/is-there-a-way-to-get-the-column-names按顺序从一个json文件中的sparksql – Mehrez

+0

@Mehrez谢谢梅赫雷斯。我也问Spark社区。有人回答同样的问题。 –

您可以在阅读json时提供schema,它会保持顺序。

StructType schema = DataTypes.createStructType(new StructField[] { 
    DataTypes.createStructField("name", DataTypes.StringType, true), 
    DataTypes.createStructField("salary", DataTypes.IntegerType, true), 
    DataTypes.createStructField("occupation", DataTypes.StringType, true), 
    DataTypes.createStructField("address", DataTypes.StringType, true)}); 

DataFrame df = sqlContext.read().schema(schema).json(jsonPath); 
df.printSchema(); 
df.show(false); 

你有两个选择

  1. 根据您的JSON数据的顺序创建架构和应用 在阅读它,
  2. 从表中,你想要的顺序选择字段。

更好的选择是在读取输入时使用模式。