我试图以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是否总是希望表存在?
  • SaveModeinsertInto有影响吗?
  • 如果以上答案为是,则
  • 给定表已存在,saveAsTableSaveMode.AppendinsertInto之间有什么区别?
  • insertIntoSaveMode.Overwrite有意义吗?
  • 最佳答案

    免责声明我已经探索insertInto已有一段时间了,尽管我与该 Realm 的专家相距甚远,但我正在分享发现的更多信息。



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

    此外,并非所有表都可以插入,即(永久)表,临时 View 或临时全局 View 都可以,但是不能:

  • 桶式表
  • 基于RDD的表



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

    是的,但只有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/

    10-12 22:38