Java Spark createDataframe来自对象的RDD,列顺序

Java Spark createDataframe来自对象的RDD,列顺序,java,scala,apache-spark,dataframe,Java,Scala,Apache Spark,Dataframe,我试图将自定义对象(Java类)的RDD转换为数据帧,我只是使用方法hiveContext.createDataframe指定对象的类。问题是数据帧是以某种奇怪的顺序使用列创建的,一旦我将DF写入配置单元,值就位于错误的列中。 这是我的密码: var objectRDD=tableDF.map((r:Row)=>newattuatore(r(0),r(1)…) […使用RDD的操作..] val resultDF=hiveContext.createDataFrame(objectRDD,cla

我试图将自定义对象(Java类)的RDD转换为数据帧,我只是使用方法hiveContext.createDataframe指定对象的类。问题是数据帧是以某种奇怪的顺序使用列创建的,一旦我将DF写入配置单元,值就位于错误的列中。 这是我的密码:

var objectRDD=tableDF.map((r:Row)=>newattuatore(r(0),r(1)…)
[…使用RDD的操作..]
val resultDF=hiveContext.createDataFrame(objectRDD,classOf[Attuatore])
resultDF.write.mode(“append”).saveAsTable(可输出)


到目前为止,我找到的使字段顺序正确的唯一解决方案是将RDD[Attuatore]转换回RDD[Row],然后调用createDataFrame()指定模式,但是,由于我必须对许多类执行此操作,因此我更希望第一种方法具有更干净的代码。

正如HiveContext.createDataFrame的文档所述

由于Java Bean中的字段没有保证排序, SELECT*查询将以未定义的顺序返回列

因此,如果您需要按定义的顺序放置字段,则必须显式地这样做,例如

val MY_COLUMNS = Seq("field1", "field2", ...)
val conformedDF = resultDF.select(MY_COLUMNS.map(col(_)):_*)
conformedDF.write...

您的代码对我不起作用,它说expected Seq[Column]Find Seq[Any],但我认为仅使用val conformedDF=resultDF.select(“field1”、“field2”和…)会起作用,因为已经修复了一个拼写错误。我的期望是,您将从其他地方(反射、元数据等)获得列列表(按所需顺序),而不是将它们硬编码为内联。显然后者更简单,如果你不介意的话。我从Java类中获取COL,你知道如何转换数组[String]以将其传递给select方法吗?在妈妈那儿。我使用的是(cols.head,cols.tail:*),其中cols是数组(我不知道Scala)。你可以在数组上使用toSeq方法,例如
def-conform(df:DataFrame,columns:array[String]):DataFrame={df.select(columns.toSeq.map(col()):*)}
但是head和tail重载也可以工作,只要你总是至少有一个专栏。非常感谢你的解释