我试图以DataFrame
模式(对我的应用程序是必需的)将Hive
写入S3
表(在Overwrite
上),并且需要在DataFrameWriter的两种方法(Spark / Scala)之间做出决定。根据我在documentation中可以看到的内容,df.write.saveAsTable
在以下方面与df.write.insertInto
不同:
saveAsTable
使用基于基于列名的分辨率,而insertInto
使用基于位置的分辨率 saveAsTable
更加关注现有表的基础架构以做出某些解析总的来说,它给我的印象是
saveAsTable
只是insertInto
的更智能版本。或者,根据用例,可能更喜欢insertInto
但是,每种方法是否都有一些自身的警告,例如在
saveAsTable
情况下会降低性能(因为它包含更多功能)?除了文档中所说的(不是很清楚)之外,他们的行为还有其他区别吗?EDIT-1
文档说关于
insertInto
这是
saveAsTable
现在我可以列出我的疑问
insertInto
是否总是希望表存在? SaveMode
对insertInto
有影响吗? saveAsTable
与SaveMode.Append
和insertInto
之间有什么区别? insertInto
与SaveMode.Overwrite
有意义吗? 最佳答案
免责声明我已经探索insertInto
已有一段时间了,尽管我与该 Realm 的专家相距甚远,但我正在分享发现的更多信息。
Yes(根据表名和数据库)。
此外,并非所有表都可以插入,即(永久)表,临时 View 或临时全局 View 都可以,但是不能:
(最近这也是我的问题!)
是的,但只有SaveMode.Overwrite。考虑
insertInto
后,其他3种保存模式就没有多大意义了(因为它只是插入一个数据集)。这是一个很好的问题!我什么也不会说,但是让我们看一个例子(希望能证明一些事情)。
scala> spark.version
res13: String = 2.4.0-SNAPSHOT
sql("create table my_table (id long)")
scala> spark.range(3).write.mode("append").saveAsTable("my_table")
org.apache.spark.sql.AnalysisException: The format of the existing table default.my_table is `HiveFileFormat`. It doesn't match the specified format `ParquetFileFormat`.;
at org.apache.spark.sql.execution.datasources.PreprocessTableCreation$$anonfun$apply$2.applyOrElse(rules.scala:117)
at org.apache.spark.sql.execution.datasources.PreprocessTableCreation$$anonfun$apply$2.applyOrElse(rules.scala:76)
...
scala> spark.range(3).write.insertInto("my_table")
scala> spark.table("my_table").show
+---+
| id|
+---+
| 2|
| 0|
| 1|
+---+
我认为,鉴于此,它非常关注
SaveMode.Overwrite
。它只是简单地重新创建目标表。spark.range(3).write.mode("overwrite").insertInto("my_table")
scala> spark.table("my_table").show
+---+
| id|
+---+
| 1|
| 0|
| 2|
+---+
Seq(100, 200, 300).toDF.write.mode("overwrite").insertInto("my_table")
scala> spark.table("my_table").show
+---+
| id|
+---+
|200|
|100|
|300|
+---+
关于apache-spark - 在不同的SaveMode中,saveAsTable和insertInto有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47844808/