apache-spark-sql - 如何根据具有相同 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中的做法)
解决方案
让我们使用 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-null
值id
,则将求和。如果id
可以有多个non-null
值,那么最好使用min/max
,以便我们获得其中一个值而不是sum
。
df1=sqlContext.sql(
'select id, max(value) over (partition by id) as value from table_view'
)