Spark 1.5.2:访问另一个数据帧内的数据帧

时间:2016-06-09 04:38:14

标签: apache-spark

我有一个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

1 个答案:

答案 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|
// +---+---------+-----+---------+