【问题标题】:How to union 2 dataframe without creating additional rows?如何在不创建额外行的情况下合并 2 个数据框?
【发布时间】:2018-06-16 12:15:22
【问题描述】:

我有 2 个数据框,我想做 .filter($"item" === "a") 同时将“S/N”保持在数字中。

我尝试了以下方法,但当我使用联合时,它最终得到了额外的行。有没有办法在不创建额外行的情况下合并 2 个数据框?

var DF1 = Seq(
  ("1","a",2),
  ("2","a",3),
  ("3","b",3),
  ("4","b",4),
  ("5","a",2)).
  toDF("S/N","item", "value")

var DF2 = Seq(
  ("1","a",2),
  ("2","a",3),
  ("3","b",3),
  ("4","b",4),
  ("5","a",2)).
  toDF("S/N","item", "value")
DF2 = DF2.filter($"item"==="a")

DF3=DF1.withColumn("item",lit(0)).withColumn("value",lit(0))

DF1.show()
+---+----+-----+
|S/N|item|value|
+---+----+-----+
|  1|   a|    2|
|  2|   a|    3|
|  3|   b|    3|
|  4|   b|    4|
|  5|   a|    2|
+---+----+-----+

DF2.show()
+---+----+-----+
|S/N|item|value|
+---+----+-----+
|  1|   a|    2|
|  2|   a|    3|
|  5|   a|    2|
+---+----+-----+

DF3.show()
+---+----+-----+
|S/N|item|value|
+---+----+-----+
|  1|   0|    0|
|  2|   0|    0|
|  3|   0|    0|
|  4|   0|    0|
|  5|   0|    0|
+---+----+-----+

DF2.union(someDF3).show()
+---+----+-----+
|S/N|item|value|
+---+----+-----+
|  1|   a|    2|
|  2|   a|    3|
|  5|   a|    2|
|  1|   0|    0|
|  2|   0|    0|
|  3|   0|    0|
|  4|   0|    0|
|  5|   0|    0|
+---+----+-----+

【问题讨论】:

    标签: scala dataframe apache-zeppelin


    【解决方案1】:

    使用过滤后的数据框将您的 S/N 左外连接,然后使用 coalesce 去除空值:

    val DF3 = DF1.select("S/N")
    
    val DF4 = (DF3.join(DF2, Seq("S/N"), joinType="leftouter")
                  .withColumn("item", coalesce($"item", lit(0)))
                  .withColumn("value", coalesce($"value", lit(0))))
    DF4.show
    +---+----+-----+
    |S/N|item|value|
    +---+----+-----+
    |  1|   a|    2|
    |  2|   a|    3|
    |  3|   0|    0|
    |  4|   0|    0|
    |  5|   a|    2|
    +---+----+-----+
    

    【讨论】:

    • 你好,我一直以为coalesce是在写入csv的时候用来对df进行分区的,不过也可以这样用。我找不到另一个很好的例子来解释这一点。不在spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/… 中。还有其他很好的参考资料来解释合并的使用吗?
    • 不是DataFrame的coalesce,而是org.apache.spark.sql.functions中定义的那个。见here。它就像 SQL 中的 coalesce 函数一样,返回第一个非空值。
    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2015-11-14
    • 2015-10-21
    • 2019-06-26
    • 1970-01-01
    • 2013-06-26
    • 2015-05-17
    相关资源
    最近更新 更多