gpt4 book ai didi

apache-spark - saveAsTable 和 insertInto 在不同的 SaveMode 下有什么区别?

转载 作者:行者123 更新时间:2023-12-03 23:27:59 27 4
gpt4 key购买 nike

我正在尝试写一个 DataFrame进入 Hive表(在 S3 上)在 Overwrite模式(对于我的应用程序是必需的)并且需要在 DataFrameWriter (Spark/Scala) 的两种方法之间做出决定。从我可以在 documentation 中读到的内容, df.write.saveAsTable不同于 df.write.insertInto在以下方面:

  • saveAsTable用途 基于列名的解析 insertInto用途 基于位置的分辨率
  • 在追加模式下,saveAsTable更关注现有表的底层架构以制定某些决议

  • 总的来说,给我的印象是 saveAsTable只是 insertInto的更智能版本.或者,根据用例,人们可能更喜欢 insertInto
    但是,在 saveAsTable 的情况下,这些方法中的每一种是否都带有一些自身的警告,例如性能损失? (因为它包含更多功能)?除了文档中提到的(不是很清楚)之外,他们的行为是否还有其他差异?

    编辑-1

    关于 insertInto 的文档说明了这一点

    Inserts the content of the DataFrame to the specified table



    这对于 saveAsTable

    In the case the table already exists, behavior of this function depends on the save mode, specified by the mode function



    现在我可以列出我的疑惑
  • 是否insertInto总是期望表存在?
  • SaveMode s 对 insertInto 有任何影响?
  • 如果以上答案是肯定的,那么
  • saveAsTable有什么区别与 SaveMode.AppendinsertInto鉴于该表已经存在?
  • 是否insertIntoSaveMode.Overwrite有道理吗?
  • 最佳答案

    免责声明 我一直在探索insertInto有一段时间了,虽然我远不是这方面的专家,但我分享这些发现是为了更好。

    Does insertInto always expect the table to exist?



    Yes (根据表名和数据库)。

    此外,并非所有表都可以插入,即(永久)表、临时 View 或临时全局 View 都可以,但不能:
  • 桶式表
  • 基于 RDD 的表

  • Do SaveModes have any impact on insertInto?



    (这也是我最近的问题!)

    是的,但只有 SaveMode.Overwrite .想好之后 insertInto其他 3 种保存模式没有多大意义(因为它只是插入数据集)。

    what's the differences between saveAsTable with SaveMode.Append and insertInto given that table already exists?



    这是一个很好的问题!我会说没有,但让我们通过一个例子来看看(希望能证明一些事情)。
    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|
    +---+

    does insertInto with SaveMode.Overwrite make any sense?



    我认为是因为它非常关注 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 - saveAsTable 和 insertInto 在不同的 SaveMode 下有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47844808/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com