将火花数据框附加到具有不同列顺序的配置单元表
Posted
技术标签:
【中文标题】将火花数据框附加到具有不同列顺序的配置单元表【英文标题】:Appending spark dataframe to hive table with different columnn order 【发布时间】:2021-02-17 10:44:21 【问题描述】:我在 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。中止,因为这可能会导致 加载不正确的数据。
是否有任何动态方式将数据框附加到配置单元表中的正确位置?这很重要,因为我希望将更多列添加到目标表中。
【问题讨论】:
您可以尝试读取目标表并获取架构。然后您可以将此架构转换为您的数据框,以确保架构一致性。 @Shadowtrooper 我正在尝试做类似的事情: target = hive.executeQuery('select * from target_Table where 1=0') test = spark.createDataFrame(source.collect(), target.schema)但是,我面临一个新错误,我仍在尝试调试,但我怀疑列没有重新排序错误消息:字段速度:ArrayType(LongType,true)无法接受对象 80.0在您可以读取没有行的目标列来获取列。然后,使用 select,您可以正确地对列进行排序并附加它:
target = hive.executeQuery('select * from target_Table where 1=0')
test = spark.createDataFrame(source.collect())
test = test.select(target.columns)
【讨论】:
以上是关于将火花数据框附加到具有不同列顺序的配置单元表的主要内容,如果未能解决你的问题,请参考以下文章