Kou*_*dra 1 hive apache-spark pyspark
我们正在尝试从 SPARK 写入 HIVE 表,并且我们正在使用 saveAsTable 函数。我想知道是否每次都删除并重新创建配置单元表?如果这样做,那么是否有任何其他可能的 spark 函数实际上只是截断和加载表,而不是删除并重新创建。
这取决于您指定的 .mode 值
覆盖 --> 然后 spark 先删除表,然后重新创建表
追加 --> 向表中插入新数据
1.如果存在则删除/如果不存在则创建parquet格式的default.spark1表
>>> df.write.mode("overwrite").saveAsTable("default.spark1")
Run Code Online (Sandbox Code Playgroud)
2.如果存在则丢弃/如果不存在则创建orc格式的default.spark1表
>>> df.write.format("orc").mode("overwrite").saveAsTable("default.spark1")
Run Code Online (Sandbox Code Playgroud)
3.将新数据附加到表中的现有数据(不删除/重新创建表)
>>> df.write.format("orc").mode("append").saveAsTable("default.spark1")
Run Code Online (Sandbox Code Playgroud)
使用 Spark 实现截断和加载:
方法一:-
您可以将数据框注册为临时表,然后执行插入覆盖语句来覆盖目标表
>>> df.registerTempTable("temp") --registering df as temptable
>>> spark.sql("insert overwrite table default.spark1 select * from temp") --overwriting the target table.
Run Code Online (Sandbox Code Playgroud)
此方法也适用于内部/外部表。
方法二:-
在内部表的情况下,我们可以先截断表然后将数据附加到表中,通过使用这种方式,我们不会重新创建表,而只是将数据附加到表中。
>>> spark.sql("truncate table default.spark1")
>>> df.write.format("orc").mode("append").saveAsTable("default.spark1")
Run Code Online (Sandbox Code Playgroud)
此方法仅适用于内部表。
即使在外部表的情况下,我们也可以通过更改表属性来执行一些解决方法来截断表。
让我们假设 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")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8223 次 |
| 最近记录: |