Dataframe Pyspark-通过比较不同数据帧中的值,根据条件更新数据帧
我有两个数据帧: old_df-将是一个固定的数据帧; 新的_df-每天都在变化 对于每个Id,根据new_df中age列的值,将更新old_df中的age,并且每当有更新时计数器将递增1。如果年龄没有变化,则计数器和年龄列保持相同的值(无增量) old_df:(编辑,包括第5个ID) 新德里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
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|
+---+---+-------+