所以将sparkDataframe直接附加到配置单元表的命令是,
df.write().mode("append").saveAsTable("tableName")
但是append模式能确保避免重复行吗?如:
如果行a在配置单元表中,其也在sparkDataframe中
将sparkDataframe附加到配置单元表将导致两行?
有没有办法确保追加时不会发生重复?
编辑:有两种方法:
shu提到的一个方法是,将配置单元表加载为spark dataframe,合并两个dataframe,删除重复项并以“overwrite”模式写回配置单元表。
其次,将配置单元表加载到temp表,将dataframe附加到temp表,获取不同的行,并将temp表覆盖回配置单元表。
我要寻找的是,有没有一种方法可以直接完成所有的工作,而不需要将数据写入某个临时表或Dataframe的中间步骤?
谢谢您。
2条答案
按热度按时间pb3skfrl1#
用df.write,你问的都不可能。对不起的。i、 你可能会得到2行。
7eumitmz2#
将sparkDataframe附加到配置单元表将导致两行a。
以确保追加时不会发生重复
在将数据追加到表中之前,需要将整个配置单元表加载到另一个Dataframe(df1)中。
然后合并两个Dataframe(df,df1)并应用
.dropDuplicates()
(或)window functions
从复制的记录中获取所需的记录。例子:
union_df=df.union(df1)
union_df.dropDuplicates()
(或)use window function
然后将数据写入新表(union_df.write().mode("append").saveAsTable("newtableName")
)最后从新表中选择数据覆盖现有的配置单元表。例子:
spark.sql("insert overwrite table <database>.<existing_table> select * from <database>.<new_table>"))
最后把那张新table扔了spark.sql("drop table <database>.<new_table>")
通过使用这种方法,您将不会在配置单元表中复制数据。