我有一个Sql数据帧df1
,其中包含以下内容:
id value
10 100
20 200
现在我有另一个数据帧df2
,如下所示:
id old_value
10 800
20 200
现在我想根据df2
的内容更新df1
,例如:
val df3 = df2.withColumn('new_value' udf_function(col(id), col(old_value))
其中udf_function
定义为:
val udf_function = udf((id: Integer, value:Integer) => {
df1[id] - value // pseudo code
})
如何在上面的udf函数中执行df1[id]
?我希望看到df3
创建如下:
id old_value new_value
10 800 700
20 200 0
答案 0 :(得分:2)
您无法在另一个DataFrame转换中调用DataFrame。你唯一的解决方案是加入id来创建一个新的DataFrame,然后你可以调用你的udf。以下示例实际上对这些关节列使用了一个简单的操作:
scala> val df1 = Seq((10, 100), (20, 200)).toDF("id", "value")
// df1: org.apache.spark.sql.DataFrame = [id: int, value: int]
scala> val df2 = Seq((10, 800), (20, 200)).toDF("id", "old_value")
// df2: org.apache.spark.sql.DataFrame = [id: int, old_value: int]
scala> val df3 = df2.join(df1, df1("id") === df2("id")).drop(df1("id")).withColumn("new_value", $"value" - $"old_value")
// df3: org.apache.spark.sql.DataFrame = [id: int, old_value: int, value: int, new_value: int]
scala> df3.show()
// +---+---------+-----+---------+
// | id|old_value|value|new_value|
// +---+---------+-----+---------+
// | 10| 800| 100| -700|
// | 20| 200| 200| 0|
// +---+---------+-----+---------+
scala> val df3 = df2.join(df1, df1("id") === df2("id")).drop(df1("id")).withColumn("new_value", $"old_value" - $"value")
// df3: org.apache.spark.sql.DataFrame = [id: int, old_value: int, value: int, new_value: int]
scala> df3.show()
// +---+---------+-----+---------+
// | id|old_value|value|new_value|
// +---+---------+-----+---------+
// | 10| 800| 100| 700|
// | 20| 200| 200| 0|
// +---+---------+-----+---------+