apache-spark - Spark合并两个数据帧并通过覆盖第二个数据帧的值来创建一个数据帧
问题描述
如何在 Apache Spark 中合并两个数据帧并通过覆盖第二个数据帧的值来创建单个数据帧?
输入:
val r1 = Seq((1, "A1_1"), (2, "A2_1"), (3, "A3_1"), (4, "A4_1")).toDF("c1","c2")
val r2 = Seq((3, "A3_2"), (4, "A4_2"), (5, "A5_2"), (6, "A6_2")).toDF("c1","c2")
期望的输出
+---+----+
| c1| c2|
+---+----+
| 1|A1_1|
| 2|A2_1|
| 3|A3_2|
| 4|A4_2|
| 5|A5_2|
| 6|A6_2|
+---+----+
解决方案
外部join
(需要数据帧的别名,因为两者都包含相同的列名)和coalesce
内置函数(coalesce
将首先返回其中的非空列)应该得到您想要的输出
import org.apache.spark.sql.functions._
r1.as("r1").join(r2.as("r2"), col("r1.c1") === col("r2.c1"), "outer")
.select(coalesce(col("r1.c1"), col("r2.c1")).as("c1"), coalesce(col("r2.c2"), col("r1.c2")).as("c2"))
.show(false)
这应该给你
+---+----+
|c1 |c2 |
+---+----+
|1 |A1_1|
|6 |A6_2|
|3 |A3_2|
|5 |A5_2|
|4 |A4_2|
|2 |A2_1|
+---+----+
我希望答案有帮助
推荐阅读
- c# - 用数据填充 DataTable 列
- reactjs - 多个 React-Router 重定向失败而没有按时重定向
- python - 是否可以在熊猫数据帧上使用 fnmatch.filter 而不是正则表达式?
- python - 找到即将到期的日期并根据它分配值 - Python数据框
- c++ - Visual C++ - 使用模块和概念时未解析的外部符号
- javascript - javascript 下拉菜单总是在特定位置打开
- javascript - 除非用户触发要显示的地图,否则避免加载 Google Maps API
- crystal-reports - Crystal Reports 报表页脚显示公式的最高值
- reactjs - 方法 handleClick() 中的参数“i”是用来做什么的?
- r - 为代码折叠花括号创建快捷方式