将 spark 数据框附加到具有不同列顺序的 hive 表

问题描述

我在 HDP3 集群中使用 pyspark 和 HiveWarehouseConnector。 架构发生了变化,所以我使用“alter table”命令更新了我的目标表,并认将新列添加到它的最后一个位置。 现在我正在尝试使用以下代码将 spark 数据帧保存到其中,但数据帧中的列按字母顺序排列,我收到以下错误消息

df = spark.read.json(df_sub_path)
hive.setDatabase('myDB') 
df.write.format("com.hortonworks.spark.sql.hive.llap.HiveWarehouseConnector").mode('append').option('table','target_table').save()

并且错误信息为:

引起:java.lang.IllegalArgumentException:Hive 列: 在同一索引中找不到 column_x: 77 in 数据框。找到 column_y。中止,因为这可能会导致 加载了错误的数据。

是否有任何动态方式将数据框附加到配置单元表中的正确位置?这很重要,因为我希望将更多列添加到目标表中。

解决方法

您可以读取没有行的目标列来获取列。然后,使用选择,您可以正确地对列进行排序并附加它:

target = hive.executeQuery('select * from target_Table where 1=0')
test = spark.createDataFrame(source.collect())
test = test.select(target.columns)