Scala Spark,比较两个数据帧并选择另一列的值
我有两个数据帧。我想做的就是: 如果列Name是“p”,那么我必须选择DF2中名为FinalValue的列,其中列id\u 1与DF2的列id\u Name匹配,否则我必须用空值填充它 例如,我有以下数据帧(DF1和DF2): 在这种情况下,输出应为:Scala Spark,比较两个数据帧并选择另一列的值,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有两个数据帧。我想做的就是: 如果列Name是“p”,那么我必须选择DF2中名为FinalValue的列,其中列id\u 1与DF2的列id\u Name匹配,否则我必须用空值填充它 例如,我有以下数据帧(DF1和DF2): 在这种情况下,输出应为: +--------+-------+-------------+ |Name | value | FinalValue | +- ------+-------+-------------+ |P |5 | c11
+--------+-------+-------------+
|Name | value | FinalValue |
+- ------+-------+-------------+
|P |5 | c11 |
|X |1 | null |
|Z |1 | null |
我尝试的是:
var df3 = df1.withColumn("FinalValue", when($"Name" === "P", df2.select(...)))
但正如你们所看到的,我不知道如何继续,因为若我选择了DF2的一列,我就不能选择DF1的另一列。我该怎么做
也许我的解释不够好,如果你需要更多的信息或解释,就告诉我。提前感谢。您可以进行左连接,然后在以下情况下使用
屏蔽最终值:
val df3 = df1.join(
df2,
df1("id_1") === df2("Id_name"),
"left"
).select(
df1.columns.dropRight(1).map(col) :+
when($"Name" === "P", $"FinalValue").as("FinalValue")
: _*
)
df3.show
+----+-----+----------+
|Name|value|FinalValue|
+----+-----+----------+
| P| 5| c11|
| X| 1| null|
| Z| 1| null|
+----+-----+----------+
这可能会起作用,但是如果两个数据帧中的联接列的名称不同呢?我该怎么做?例如Name和N_id?@MLstudent您是指df1中除id_1之外的所有列吗?您可以选中“我的编辑答案”下拉列表,然后从列名列表中删除最后一个元素。映射将每个列表元素转换为列对象:+将列附加到列列表,并:*将列表扩展为varargs。
val df3 = df1.join(
df2,
df1("id_1") === df2("Id_name"),
"left"
).select(
df1.columns.dropRight(1).map(col) :+
when($"Name" === "P", $"FinalValue").as("FinalValue")
: _*
)
df3.show
+----+-----+----------+
|Name|value|FinalValue|
+----+-----+----------+
| P| 5| c11|
| X| 1| null|
| Z| 1| null|
+----+-----+----------+