使用dataframes模拟SQL update语句-可能吗?

使用dataframes模拟SQL update语句-可能吗?,dataframe,pyspark,sql-update,Dataframe,Pyspark,Sql Update,在pyspark中,我有两个数据帧,我想使用它们模拟SQL update语句 以下是我尝试模拟的sql代码: update T1 set name = ( select T2.NAME from T2 where T2.ID = T1.ID ) where T1.END_DATE = '31-dec-1999' and exists ( sele

在pyspark中,我有两个数据帧,我想使用它们模拟SQL update语句

以下是我尝试模拟的sql代码:

update T1
    set name = (
        select T2.NAME
        from T2
        where
            T2.ID = T1.ID
        )
    where
        T1.END_DATE = '31-dec-1999'
    and exists (
            select
                ID
            from T2
            where
                T2.ID = T1.ID
        )
下面是一些数据帧的设置代码

valuesA = [('tom',1,'31-dec-1999'),('dick',2,'01-apr-2017'),('harry',3,'01-jan-2019'),('george',4,'31-dec-1999')]
T1 = spark.createDataFrame(valuesA,['name','id','end_date'])
T1.createOrReplaceTempView("T1")
valuesB = [('fred',1),('james',2),('nigel',4)]
T2 = spark.createDataFrame(valuesB,['name','id'])
T2.createOrReplaceTempView("T2")

spark.sql("select * from T1").show()
spark.sql("select * from T2").show()
上面的输出

+------+---+-----------+
|  name| id|   end_date|
+------+---+-----------+
|   tom|  1|31-dec-1999|
|  dick|  2|01-apr-2017|
| harry|  3|01-jan-2019|
|george|  4|31-dec-1999|
+------+---+-----------+

+-----+---+
| name| id|
+-----+---+
| fred|  1|
|james|  2|
|nigel|  4|
+-----+---+
所需输出为

+------+---+-----------+
|  name| id|   end_date|
+------+---+-----------+
|  fred|  1|31-dec-1999|
|  dick|  2|01-apr-2017|
| harry|  3|01-jan-2019|
| nigel|  4|31-dec-1999|
+------+---+-----------+
这就是我到目前为止得到的

from pyspark.sql import functions as f

T1.alias('a').join(
    T2.alias('b'), ['id'], how='outer'
).select('id', 'end_date',
    f.coalesce('b.name', 'a.name').alias('name')
).show()
这就是输出

+---+-----------+-----+
| id|   end_date| name|
+---+-----------+-----+
|  1|31-dec-1999| fred|
|  3|01-jan-2019|harry|
|  2|01-apr-2017|james|
|  4|31-dec-1999|nigel|
+---+-----------+-----+
我不确定如何仅在T1上的结束日期为1999年12月31日时进行更新,即第2行的名称字段应保持为“dick”

尝试以下方法:

导入pyspark.sql.f函数
从pyspark.sql.functions导入lit、col和when
T1.别名('a')。连接(
T2.别名('b'),['id'],how='outer'
).选择('id','end_date',
f、 当(f.col(“结束日期”)==lit(“1999年12月31日”),f.col(f.col('b.name')、f.col('a.name'))。否则(f.col('a.name'))。别名('name'))
).show()

检查其他条件hm,添加了一些
f.col
,但不确定还有什么问题?