在Spark的saveAsTable上

时间:2018-07-17 22:08:51

标签: apache-spark hive pyspark

我们正在尝试从SPARK写入HIVE表,并且正在使用saveAsTable函数。我想知道是否每次保存saveAsTable并重新创建配置单元表?如果这样做,那么还有其他可能的spark函数实际上将截断并加载表,而是删除并重新创建。

2 个答案:

答案 0 :(得分:3)

这取决于您指定的.mode值

  

覆盖->然后先Spark删除表,然后重新创建表

     

追加->将新数据插入表格

1。如果存在则拖放/如果不存在则创建default.spark1表以实木复合地板格式

>>> df.write.mode("overwrite").saveAsTable("default.spark1")

2。如果存在则拖放/如果不存在则创建default.spark1表为兽人格式

>>> df.write.format("orc").mode("overwrite").saveAsTable("default.spark1")

3。将新数据追加到表中的现有数据上(不删除/重新创建表)

>>> df.write.format("orc").mode("append").saveAsTable("default.spark1")

使用Spark实现截断和加载:

方法1:-

您可以将数据帧注册为临时表,然后执行插入覆盖语句以覆盖目标表

>>> df.registerTempTable("temp") --registering df as temptable
>>> spark.sql("insert overwrite table default.spark1 select * from temp") --overwriting the target table.

此方法也将适用于内部/外部表。

方法2:-

对于内部表,我们可以先截断表,然后将数据追加到表中,通过这种方式,我们不会重新创建表,而只是将数据追加到表中。

>>> spark.sql("truncate table default.spark1")
>>> df.write.format("orc").mode("append").saveAsTable("default.spark1")

此方法仅对内部表有效。

即使是外部表,我们也可以通过更改表属性采取一些变通方法来截断表。

我们假设default.spark1表是外部表,并且

--change external table to internal table
>>> saprk.sql("alter table default.spark1 set tblproperties('EXTERNAL'='FALSE')")
--once the table is internal then we can run truncate table statement
>>> spark.sql("truncate table default.spark1")
--change back the table as External table again
>>> spark.sql("alter table default.spark1 set tblproperties('EXTERNAL'='TRUE')")
--then append data to the table
>>> df.write.format("orc").mode("append").saveAsTable("default.spark1")

答案 1 :(得分:0)

您还可以使用insertInto("table"),它不会重新创建表

saveAsTable之间的主要区别是insertInto期望该表已经存在,并且基于列的顺序而不是名称。