【问题标题】:spark - scala - save dataframe to a table with overwrite modespark - scala - 将数据帧保存到具有覆盖模式的表中
【发布时间】:2018-03-10 12:17:15
【问题描述】:

我想知道“覆盖”到底是做什么的。假设我有一个表,在表“tb1”中有以下记录(抱歉表的错误表示)

司机 vin 制作模型

martin abc ford escape
john abd toyota camry
amy abe chevrolet malibu
carlos abf honda civic

现在我有以下具有相同列但具有以下行/数据的数据框(mydf)

martin abf toyota corolla
carlos abg nissan versa

上面的dataframe用overwrite模式保存到“tb1”后,dataframe会完全删除“tb1”的内容,写入mydf的数据(两条记录以上)吗?

但是,我希望覆盖模式仅覆盖那些“驱动程序”列具有相同值的行。在这种情况下,“tb1”中的 4 条记录中,mydf 将仅覆盖 2 条以上的记录,结果表如下-

司机 vin 制作模型

martin abf toyota corolla
john abd toyota camry
amy abe chevrolet malibu
carlos abg nissan versa

我可以使用覆盖模式实现此功能吗?

mydf.write.mode(SaveMode.Overwrite).saveAsTable("tb1")

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您的意思是在主键上合并 2 个数据框。您想合并两个数据框并用新行替换旧行并附加额外的行(如果存在)。

    这不能通过 SaveMode.Overwrite 或 SaveMode.append 实现。

    为此,您需要在主键上实现 2 个数据帧的合并功能。

    像这样的

     parentDF = // actual dataframe
     deltaDF = // new delta to be merged
    
    
     val updateDF = spark.sql("select parentDF.* from parentDF join deltaDF on parentDF.id = deltaDF.id")
     val totalDF = parentDF.except(updateDF).union(deltaDF)
     totalDF.write.mode(SaveMode.Overwrite).saveAsTable("tb1")
    

    【讨论】:

      【解决方案2】:

      回答你的问题:

      我可以使用覆盖模式实现此功能吗?

      不,你不能。

      Overwrite 所做的实际上是删除所有要填充的表并再次创建它,但现在使用您告诉它的新 DataFrame。

      要获得您想要的结果,您可以执行以下操作:

      • 将要“更新”的表格信息保存到新的 DataFrame 中:

        val dfTable = hiveContext.read.table("table_tb1")

      • 在要更新的表的 DF (dfTable) 和 带有您的新信息的 DF (mydf),通过您的“PK”,即 在您的情况下,将是 driver 列。

      在同一句话中,您过滤 mydf("driver")为空 的记录,即不匹配且没有更新的记录对于这些。

      val newDf = dfTable.join(mydf, dfTable("driver") === mydf("driver"), "leftouter" ).filter(mydf("driver").isNull)
      
      • 之后,截断您的表 tb1 并插入两个 DataFrame: newDFmydf 数据帧:

      |

      dfArchivo.write.mode(SaveMode.Append).insertInto("table_tb1")  /** Info with no changes */
      mydf.write.mode(SaveMode.Append).insertInto("table_tb1") /** Info updated */
      

      这样就可以得到你想要的结果了。

      问候。

      【讨论】:

        猜你喜欢
        • 2018-06-22
        • 2020-11-30
        • 2021-05-23
        • 2020-08-27
        • 2020-04-10
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        相关资源
        最近更新 更多