【问题标题】:Merge two data frame with few different columns合并具有几个不同列的两个数据框
【发布时间】:2016-10-03 08:49:30
【问题描述】:

我想合并几个不同列的 DataFrame。 假设,

  • DataFrame A 有 3 列:Column_1、Column_2、Column 3

  • DataFrame B 有 3 列:Column_1、Columns_2、Column_4

  • DataFrame C 有 3 列:Column_1、Column_2、Column_5

我想合并这些 DataFrame,这样我得到一个 DataFrame,如下所示:

Column_1、Column_2、Column_3、Column_4 Column_5

DataFrame 的数量可能会增加。有没有办法得到这个合并?这样对于特定的 Column_1 Column_2 组合,我会得到同一行中其他三列的值,如果对于 Column_1 Column_2 的特定组合,某些列中没有数据,那么它应该在那里显示 null。

数据帧 A:

Column_1 Column_2 Column_3
   1        x        abc
   2        y        def

数据帧 B:

Column_1 Column_2 Column_4
   1        x        xyz
   2        y        www
   3        z        sdf

A 和 B 的合并:

Column_1 Column_2 Column_3 Column_4
   1        x        abc     xyz
   2        y        def     www
   3        z        null    sdf

【问题讨论】:

    标签: apache-spark dataframe apache-spark-sql


    【解决方案1】:

    如果我正确理解您的问题,您将需要使用一系列列作为键来执行 外部联接

    我已使用您问题中提供的数据来举例说明它是如何完成的:

    scala> val df1 = Seq((1,"x","abc"),(2,"y","def")).toDF("Column_1","Column_2","Column_3")
    // df1: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_3: string]
    
    scala> val df2 = Seq((1,"x","xyz"),(2,"y","www"),(3,"z","sdf")).toDF("Column_1","Column_2","Column_4")
    // df2: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_4: string]
    
    scala> val df3 = df1.join(df2, Seq("Column_1","Column_2"), "outer")
    // df3: org.apache.spark.sql.DataFrame = [Column_1: int, Column_2: string, Column_3: string, Column_4: string]
    
    scala> df3.show
    // +--------+--------+--------+--------+                                           
    // |Column_1|Column_2|Column_3|Column_4|
    // +--------+--------+--------+--------+
    // |       1|       x|     abc|     xyz|
    // |       2|       y|     def|     www|
    // |       3|       z|    null|     sdf|
    // +--------+--------+--------+--------+
    

    这被称为equi-join 和另一个DataFrame 使用给定的列。

    与其他连接函数不同,连接列在输出中只会出现一次,即类似于 SQL 的JOIN USING 语法。

    注意

    从 Spark 1.6 开始提供外部等值连接。

    【讨论】:

      【解决方案2】:

      首先对所有三个数据帧使用以下代码,以便可以在数据帧上实现SQL查询

      DF1.createOrReplaceTempView("df1view")
      DF2.createOrReplaceTempView("df2view")
      DF3.createOrReplaceTempView("df3view")
      

      然后使用这个join命令进行合并

      val intermediateDF = spark.sql("SELECT a.column1, a.column2, a.column3, b.column4 FROM df1view a leftjoin df2view b on a.column1 = b.column1 and a.column2 = b.column2")`
      
      intermediateDF.createOrReplaceTempView("imDFview")
      
      val resultDF = spark.sql("SELECT a.column1, a.column2, a.column3, a.column4, b.column5 FROM imDFview a leftjoin df3view b on a.column1 = b.column1 and a.column2 = b.column2")
      

      这些连接也可以在一个连接中一起完成,而且由于您想要column1和column2的所有值,您可以使用full outer join而不是left join

      【讨论】:

        猜你喜欢
        • 2015-03-21
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 2020-12-04
        • 2017-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多