【问题标题】:How to replace a dataframe column with another dataframe column如何用另一个数据框列替换数据框列
【发布时间】:2019-01-14 00:32:15
【问题描述】:

我有两个数据框:

数据框1

 DATE1|
+----------+
|2017-01-08|
|2017-10-10|
|2017-05-01|

dataframe2

|NAME  | SID|     DATE1|     DATE2|ROLL|  SCHOOL|
+------+----+----------+----------+----+--------+
| Sayam|22.0|  8/1/2017|  7 1 2017|3223|  BHABHA|
|ADARSH| 2.0|10-10-2017|10.03.2017| 222|SUNSHINE|
| SADIM| 1.0|  1.5.2017|  1/2/2017| 111|     DAV|

预期输出

  |  NAME| SID|     DATE1|     DATE2|ROLL|  SCHOOL|
  +------+----+----------+----------+----+--------+
  | Sayam|22.0|2017-01-08|  7 1 2017|3223|  BHABHA|
  |ADARSH| 2.0|2017-10-10|10.03.2017| 222|SUNSHINE|
  | SADIM| 1.0|2017-05-01|  1/2/2017| 111|     DAV|

我想将 dataframe2 中的 DATE1 列替换为 dataframe1 的 DATE1 列。我需要一个通用的解决方案。

我们将不胜感激。

我试过withColumn方法如下

dataframe2.withColumn(newColumnTransformInfo._1, dataframe1.col("DATE1").cast(DateType))

但是,我收到一个错误:

org.apache.spark.sql.AnalysisException: resolved attribute(s)

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您不能从另一个数据框中添加列

    您可以做的是连接两个数据框并保留您想要的列,两个数据框必须有一个共同的连接列。如果您没有公共列并且数据按顺序排列,您可以为两个数据框分配一个递增的 id,然后加入。

    这是您案例的简单示例

    //Dummy data
      val df1 = Seq(
        ("2017-01-08"),
        ("2017-10-10"),
        ("2017-05-01")
      ).toDF("DATE1")
    
      val df2 = Seq(
        ("Sayam", 22.0, "2017-01-08", "7 1 2017", 3223, "BHABHA"),
        ("ADARSH", 2.0, "2017-10-10", "10.03.2017", 222, "SUNSHINE"),
        ("SADIM", 1.0, "2017-05-01", "1/2/2017", 111, "DAV")
      ).toDF("NAME", "SID", "DATE1", "DATE2", "ROLL", "SCHOOL")
    
      //create new Dataframe1 with new column id
      val rows1 = df1.rdd.zipWithIndex().map{
        case (r: Row, id: Long) => Row.fromSeq(id +: r.toSeq)}
      val dataframe1 = spark.createDataFrame(rows1, StructType(StructField("id", LongType, false) +: df1.schema.fields))
    
      //create new Dataframe2 with new column id
      val rows2= df2.rdd.zipWithIndex().map{
        case (r: Row, id: Long) => Row.fromSeq(id +: r.toSeq)}
      val dataframe2 = spark.createDataFrame(rows2, StructType(StructField("id", LongType, false) +: df2.schema.fields))
    
    
      dataframe2.drop("DATE1")
        .join(dataframe1, "id")
        .drop("id").show()
    

    输出:

    +------+----+----------+----+--------+----------+
    |  NAME| SID|     DATE2|ROLL|  SCHOOL|     DATE1|
    +------+----+----------+----+--------+----------+
    | Sayam|22.0|  7 1 2017|3223|  BHABHA|2017-01-08|
    |ADARSH| 2.0|10.03.2017| 222|SUNSHINE|2017-10-10|
    | SADIM| 1.0|  1/2/2017| 111|     DAV|2017-05-01|
    +------+----+----------+----+--------+----------+
    

    希望这会有所帮助!

    【讨论】:

    • 现在可以正常工作了。如果其他测试用例有任何问题,我会通知您。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2021-02-18
    • 2021-09-08
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多