如何将sparkDataframe插入到配置单元内部表而不复制?

cngwdvgl  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(379)

所以将sparkDataframe直接附加到配置单元表的命令是,

df.write().mode("append").saveAsTable("tableName")

但是append模式能确保避免重复行吗?如:
如果行a在配置单元表中,其也在sparkDataframe中
将sparkDataframe附加到配置单元表将导致两行?
有没有办法确保追加时不会发生重复?
编辑:有两种方法:
shu提到的一个方法是,将配置单元表加载为spark dataframe,合并两个dataframe,删除重复项并以“overwrite”模式写回配置单元表。
其次,将配置单元表加载到temp表,将dataframe附加到temp表,获取不同的行,并将temp表覆盖回配置单元表。
我要寻找的是,有没有一种方法可以直接完成所有的工作,而不需要将数据写入某个临时表或Dataframe的中间步骤?
谢谢您。

pb3skfrl

pb3skfrl1#

用df.write,你问的都不可能。对不起的。i、 你可能会得到2行。

7eumitmz

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>") 通过使用这种方法,您将不会在配置单元表中复制数据。

相关问题