配置单元已从spark保存稳定

bfrts1fy  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(317)

我们正在尝试从spark写入配置单元表,并使用saveastable函数。我想知道是否每次saveastable都删除并重新创建配置单元表?如果它这样做了,那么是否还有其他可能的spark函数实际上只是截断并加载一个表,而不是删除并重新创建。

oalqel3c

oalqel3c1#

也可以使用insertinto(“table”),它不会重新创建表
saveastable之间的主要区别在于insertinto期望表已经存在,并且基于列的顺序而不是名称。

vwoqyblh

vwoqyblh2#

这取决于您指定的.mode值
overwrite-->then spark先删除表,然后重新创建表
追加-->向表中插入新数据
1.drop if exists/create if not exists default.spark1表格Parquet格式

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

2.drop if exists/create if not exists orc格式的default.spark1表

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

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

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

使用spark实现截断和加载:
方法1:-
您可以将Dataframe注册为临时表,然后执行insert overwrite语句来覆盖目标表

>>> 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")

相关问题