Scala spark是否在内部按字母顺序重新排列数据帧中字段的顺序?

Scala spark是否在内部按字母顺序重新排列数据帧中字段的顺序?,scala,dataframe,apache-spark,schema,Scala,Dataframe,Apache Spark,Schema,我正在创建一个spark streaming作业,它读取来自Kafka主题的JSON消息。对于我从Dstream获得的每个RDD,我正在创建一个数据帧。我的要求是将此数据帧写入hdfs路径。在写入之前,我需要检查此消息的模式是否格式正确。 因此,我创建了一个StructType customSchema,其预期字段的顺序与Kafka主题中JSON消息中的顺序相同。我试图比较这两个字段,但这不起作用。即使所有字段的顺序都正确,结果也是错误的 我有一个json文件,格式与Kafka主题中的格式相同

我正在创建一个spark streaming作业,它读取来自Kafka主题的JSON消息。对于我从Dstream获得的每个RDD,我正在创建一个数据帧。我的要求是将此数据帧写入hdfs路径。在写入之前,我需要检查此消息的模式是否格式正确。 因此,我创建了一个StructType customSchema,其预期字段的顺序与Kafka主题中JSON消息中的顺序相同。我试图比较这两个字段,但这不起作用。即使所有字段的顺序都正确,结果也是错误的

我有一个json文件,格式与Kafka主题中的格式相同

{"transactionId":"12345","accountName":"XXX1","sessionKey":"WEB","description":"INR"}
我在它周围创建了一个数据框

val df=spark.read.json("/data/path/sample/")

scala> df.printSchema
root
 |-- accountName: string (nullable = true)
 |-- description: string (nullable = true)
 |-- sessionKey: string (nullable = true)
 |-- transactionId: string (nullable = true)
注意:当我打印我创建的df模式时,它是按字母顺序打印的

我创建了StructType的customSchema

scala> val schema1=  StructType( Array (StructField("transactionId",StringType, true),StructField("accountName",StringType, true),StructField("sessionKey",StringType, true),StructField("description",StringType, true)))
schema1: org.apache.spark.sql.types.StructType = StructType(StructField(transactionId,StringType,true), StructField(accountName,StringType,true), StructField(sessionKey,StringType,true), StructField(description,StringType,true))
当我试图匹配它时,结果是错误的

scala> val d=df.schema==schema1
            d: Boolean = false
对于.equals方法,其结果也是false 现在,如果我以与printSchema打印相同的方式创建customSchema

scala> val schema2=  StructType( Array (StructField("accountName",StringType, true),StructField("description",StringType, true),StructField("sessionKey",StringType, true),StructField("transactionId",StringType, true)))
schema2: org.apache.spark.sql.types.StructType = StructType(StructField(accountName,StringType,true), StructField(description,StringType,true), StructField(sessionKey,StringType,true), StructField(transactionId,StringType,true))
如果我现在比较这两个,它会像预期的那样运行良好

scala> val j=df.schema==schema2
            j: Boolean = true

因此,根据我的观察,spark是否按照字母顺序重新排列了内部字段的顺序,因为我在文档中找不到它。

spark Json推断模式(如果未提供)。 如果按特定顺序需要列,则选择
是更好的选择

val colsArr = Array("col1","col2","col3")
val df = df.select(colsArr.head,colsArr.tail:_*)

是的,但是为什么它会按照字母顺序而不是Json中字段的顺序重新排列呢?这是spark in read.Json方法中的正常行为吗?因为我没有得到任何文档表明这一点?