如何在不重复的情况下将Spark DataFrame插入Hive内部表?

时间:2018-10-07 10:16:25

标签: apache-spark hive apache-spark-sql

因此将spark数据帧直接附加到配置单元表的命令是

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

但是append模式是否可以确保避免重复行? 例如:

  • 如果A行在蜂巢表中,并且它也在spark数据帧中
  • 将spark数据框附加到配置单元表将导致两行A?

有没有一种方法可以确保追加时不会发生重复?

编辑: 有两种方法:

    shu提到的
  • 其中一个,将配置单元表作为spark数据帧加载,合并两个数据帧,删除重复项,然后以“覆盖”模式写回到配置单元表。
  • 第二,将配置单元表加载到临时表,将数据帧追加到临时表,获取不同的行并将临时表覆盖回配置单元表。

我要寻找的是,有没有一种方法可以直接完成所有这些操作而又没有将数据写入某些临时表或数据帧的中间步骤?

谢谢。

2 个答案:

答案 0 :(得分:1)

将spark数据框附加到配置单元表将导致 两行A

为确保在“追加”期间不会发生重复

  1. 您需要将整个配置单元表加载到另一个数据帧(df1)中 将数据附加到表中之前

  2. 然后合并两个数据帧(df,df1)并应用.dropDuplicates()(或) window functions从重复的记录中获取所需的记录 记录。

    示例:

    union_df=df.union(df1)

    union_df.dropDuplicates()(或)use window function

  3. 然后将数据写入新的 表格1}}) 然后最终从新表中选择数据,覆盖 现有的配置单元表。

    示例:

    union_df.write().mode("append").saveAsTable("newtableName")

  4. 最后删除新表 spark.sql("insert overwrite table <database>.<existing_table> select * from <database>.<new_table>"))

通过这种方式,您将无法在配置单元表中重复数据。

答案 1 :(得分:0)

df.write不能满足您的任何要求。抱歉。即您将可能获得2行。