我正在尝试将自定义对象(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()来指定模式,但是因为我必须这样做对于很多类,我更倾向于采用第一种方法来获得更清晰的代码。
答案 0 :(得分:1)
正如HiveContext.createDataFrame的文档所说
由于Java Bean中的字段没有保证排序, SELECT *查询将以未定义的顺序返回列。
因此,如果您需要按定义的顺序放置字段,则必须明确地执行此操作,例如
val MY_COLUMNS = Seq("field1", "field2", ...)
val conformedDF = resultDF.select(MY_COLUMNS.map(col(_)):_*)
conformedDF.write...