首页 > 解决方案 > 如何根据具有相同 id 的另一行更新一行

问题描述

使用 Spark 数据框,我想根据具有相同 ID 的其他行更新行值。

例如,我有以下记录,

id,value
1,10
1,null
1,null
2,20
2,null
2,null

我想得到如下结果

id,value
1,10
1,10
1,10
2,20
2,20
2,20

总而言之,某些行中的 value 列为 null,如果有另一行具有相同 id 且具有有效值,我想更新它们。

在sql中,我可以简单地用inner-join写一个更新语句,但是我在Spark-sql中没有找到同样的方法。

update combineCols a inner join combineCols b on a.id = b.id set a.value = b.value (这就是我在sql中的做法)

标签: apache-spark-sql

解决方案


让我们使用 SQL 方法来解决这个问题 -

myValues = [(1,10),(1,None),(1,None),(2,20),(2,None),(2,None)]
df = sqlContext.createDataFrame(myValues,['id','value'])

df.registerTempTable('table_view')
df1=sqlContext.sql(
    'select id, sum(value) over (partition by id) as value from table_view'
)
df1.show()
+---+-----+
| id|value|
+---+-----+
|  1|   10|
|  1|   10|
|  1|   10|
|  2|   20|
|  2|   20|
|  2|   20|
+---+-----+

警告: Thos 代码假定non-null任何特定的id. 当我们groupby重视时,我们必须使用一个aggregation函数,我曾经使用过sum. 如果 any 有 2 个non-nullid,则将求和。如果id可以有多个non-null值,那么最好使用min/max,以便我们获得其中一个值而不是sum

df1=sqlContext.sql(
    'select id, max(value) over (partition by id) as value from table_view'
)

推荐阅读