使用dataframes模拟SQL update语句-可能吗?
在pyspark中,我有两个数据帧,我想使用它们模拟SQL update语句 以下是我尝试模拟的sql代码:使用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
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
,但不确定还有什么问题?