Dataframe Pyspark-通过比较不同数据帧中的值,根据条件更新数据帧

Dataframe Pyspark-通过比较不同数据帧中的值,根据条件更新数据帧,dataframe,apache-spark,pyspark,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我有两个数据帧: old_df-将是一个固定的数据帧; 新的_df-每天都在变化 对于每个Id,根据new_df中age列的值,将更新old_df中的age,并且每当有更新时计数器将递增1。如果年龄没有变化,则计数器和年龄列保持相同的值(无增量) old_df:(编辑,包括第5个ID) 新德里 id age 1 20 2 21 3 22 4 19 现在旧df的输出应为: 老东道主: id age counter 1 20 1 2 21 1

我有两个数据帧:

old_df-将是一个固定的数据帧; 新的_df-每天都在变化

对于每个Id,根据new_df中age列的值,将更新old_df中的age,并且每当有更新时计数器将递增1。如果年龄没有变化,则计数器和年龄列保持相同的值(无增量)

old_df:(编辑,包括第5个ID)

新德里

id  age 
1   20   
2   21   
3   22   
4   19 
现在旧df的输出应为:

老东道主:

id age counter
1   20   1
2   21   1
3   22   0
4   19   0
5   11   0  
到目前为止,我尝试了以下方法:

df_old = df_old.withColumnRenamed('id','id_old')\
.withColumnRenamed('age','age_old')

joinedDF = df_old.join(df_new, df_new["id"] == df_old["id_old"], "outer")

if(joinedDF.select(joinedDF.age_old != joinedDF.age)):
        joinedDF = joinedDF.withColumn("age_old",joinedDF['age'])
        joinedDF = joinedDF.withColumn("counter",joinedDF['counter']+1)


joinedDF[['id_old', 'age_old', 'counter']].toPandas()


id_old age_old counter
1         20   1
2         21   1
3         22   1
4         19   1
如果你能看到我得到的id_old=3和4的输出,我应该得到计数器值0,但得到1。
非常感谢您的任何帮助

这是您实现同样目标的方法

row = Row('id', 'age','counter')
old_df = spark.createDataFrame([row(1, 12, 0), row(2, 15, 0), row(3, 22, 0), row(4, 19, 0)])
old_df.show()

row2 = Row('id', 'age')
new_df = spark.createDataFrame([row(1, 20), row(2, 21), row(3, 22), row(4, 19)])
new_df.show()

old_df = old_df.alias("old_df").join(new_df.alias("new_df"), old_df.id == new_df.id, "inner").selectExpr("old_df.id as id", "new_df.age as age ",
                                                                          "if(old_df.age != new_df.age, old_df.counter+1,old_df.counter) as counter").sort("id")

old_df.show()
输出:

+---+---+-------+
| id|age|counter|
+---+---+-------+
|  1| 12|      0|
|  2| 15|      0|
|  3| 22|      0|
|  4| 19|      0|
+---+---+-------+

+---+---+
| id|age|
+---+---+
|  1| 20|
|  2| 21|
|  3| 22|
|  4| 19|
+---+---+

+---+---+-------+
| id|age|counter|
+---+---+-------+
|  1| 20|      1|
|  2| 21|      1|
|  3| 22|      0|
|  4| 19|      0|
+---+---+-------+

谢谢你,这就是你所期待的,请考虑接受答案@ USER 1994。
+---+---+-------+
| id|age|counter|
+---+---+-------+
|  1| 12|      0|
|  2| 15|      0|
|  3| 22|      0|
|  4| 19|      0|
+---+---+-------+

+---+---+
| id|age|
+---+---+
|  1| 20|
|  2| 21|
|  3| 22|
|  4| 19|
+---+---+

+---+---+-------+
| id|age|counter|
+---+---+-------+
|  1| 20|      1|
|  2| 21|      1|
|  3| 22|      0|
|  4| 19|      0|
+---+---+-------+