apache-spark - 如何使用不同的df列更新现有列
问题描述
我有两个 DF,DF A 和 DF B。两者都有相同的架构。DF A的C列值不同,DF B的C列值不同,其他数据完全相同。现在,如果我想合并两个表DF C,如何在火花中做到这一点?我试图做加入操作,但它正在创建重复的列。例如:DF A:
+---+----+
| k| v|
+---+----+
| 1| |
| 2|bar1|
+---+----+
东风乙:
+---+----+
| k| v|
+---+----+
| 1|foo1|
| 2| |
+---+----+
预期结果:
+---+----+
| k| v|
+---+----+
| 1|foo1|
| 2|bar1|
+---+----+
解决方案
您可以使用usingColumn
或usingColumns
避免重复:
val dfA = Seq((1, Option.empty[String]), (2, Some("bar1"))).toDF("k", "v")
val dfB = Seq((1, Some("foo1")), (2, Option.empty[String])).toDF("k", "v")
dfA.withColumnRenamed("v", "_av")
.join(dfB.withColumnRenamed("v", "_bv"), usingColumn = "k")
.withColumn("v", coalesce($"_av", $"_bv"))
.drop("_av", "_bv")
.show()
输出:
+---+----+
| k| v|
+---+----+
| 1|foo1|
| 2|bar1|
+---+----+
推荐阅读
- python - 如果多列的总和为 0,则用 nan 填充列
- c++ - Eclipse CDT:无法添加语言设置提供程序
- dotnetnuke - DNN 站点的导出/导入
- python - 如何将已迭代到列表中的数字添加到字符串中?
- c++ - 尝试使用谓词函数会导致错误:“std::sort”找不到匹配的重载函数
- c# - 试图在 JSON 中获得花括号而不是方括号
- php - 如何查找php网站下的目录结构和文件名?
- r - 如何将 R 数据框写入雪花数据库表
- c++ - 在实践中,为什么不同的编译器会计算不同的 int x = ++i + ++i; 值?
- svelte - context="module" 如何在 Svelte 和 Sapper 中工作?