Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark,比较两个数据帧并选择另一列的值_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala Spark,比较两个数据帧并选择另一列的值

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是“p”,那么我必须选择DF2中名为FinalValue的列,其中列id\u 1与DF2的列id\u Name匹配,否则我必须用空值填充它

例如,我有以下数据帧(DF1和DF2):

在这种情况下,输出应为:

+--------+-------+-------------+
|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|
+----+-----+----------+