将火花数据框附加到具有不同列顺序的配置单元表

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在 类型中,前一列的 floatType 值为 80.0,因此它没有获取目标表的架构列顺序 您可以尝试获取列并使用选择:test = spark.createDataFrame(source.collect()).select(target.columns)。其他选项是使用目标创建一个 unionbyname 并测试并保存。 看看这个答案是否有助于您可以使用的方法:***.com/questions/54457068/… @Shadowtrooper 确实如此!我非常专注于使用架构,我忘记了我可以使用神奇的选择:) 现在我正在使用这样的东西:test = df.select(target.columns) 然后写入配置单元表我很乐意接受你的作为答案的回应:) 【参考方案1】:

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

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

【讨论】:

以上是关于将火花数据框附加到具有不同列顺序的配置单元表的主要内容,如果未能解决你的问题,请参考以下文章

如何将原始数据插入具有不同列序列的配置单元表中?

如何在配置单元表中插入具有地图列的数据框

匹配列并附加到数据框,Python 3.6

附加两个具有相同列,不同顺序的数据帧

计算火花数据框中所有列(300 列)的每个不同值的出现次数

将多个火花数据框列转换为具有列表类型的单列