从RDD对象的Spark createDataframe,列顺序

时间:2017-05-09 10:29:48

标签: java scala apache-spark dataframe

我正在尝试将自定义对象(Java类)的RDD转换为Dataframe,我只是使用了指定对象类的方法hiveContext.createDataframe。问题是数据框是以一些奇怪的顺序创建的,一旦我将DF写入Hive,值就在错误的列中。 这是我的代码:

var objectRDD = tableDF.map((r: Row) => new Attuatore(r(0),r(1)...)) [.. operations with the RDD ..] val resultDF = hiveContext.createDataFrame(objectRDD, classOf[Attuatore]) resultDF.write.mode("append").saveAsTable(outputTable)

到目前为止,我发现只有正确顺序的字段的唯一解决方案是将RDD [Attuatore]转换回RDD [Row],然后调用createDataFrame()来指定模式,但是因为我必须这样做对于很多类,我更倾向于采用第一种方法来获得更清晰的代码。

1 个答案:

答案 0 :(得分:1)

正如HiveContext.createDataFrame的文档所说

  

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

因此,如果您需要按定义的顺序放置字段,则必须明确地执行此操作,例如

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