dataframe - 使用数据框模拟 SQL 更新语句 - 可能吗?
问题描述
在 pyspark 中,我有两个数据框,我想使用它们来模拟 SQL 更新语句。
这是我试图模拟的 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 上的 end_date 为 1999 年 12 月 31 日时进行更新,即第 2 行的名称字段应保持“迪克”
解决方案
试试这个:
import pyspark.sql.functions as f
from pyspark.sql.functions import lit, col, when
T1.alias('a').join(
T2.alias('b'), ['id'], how='outer'
).select('id', 'end_date',
f.when(f.col("end_date")==lit("31-dec-1999"), f.coalesce(f.col('b.name'), f.col('a.name'))).otherwise(f.col('a.name')).alias('name')
).show()
推荐阅读
- python - 如何使用文件名(如果提供)或标准输入(如果未提供 argparse)
- ios - UISearchBar 不会更改 iOS 12.1 的搜索图标和占位符颜色
- c++ - 如何重载流运算符以使用位于不同文件中的函数?
- python - 比较两个字符(在字符串内)如何在 Python 中工作
- flutter - 在 DropdownButton 中选择项目时出现断言错误
- css - 为什么 CSS Grid 元素宽度不会在自动流上调整大小:MS Edge 中的列?
- html - 将项目从一个多选列表新添加/删除到另一个列表时更改其背景颜色
- python - 足球队联赛
- python - 有一个“AttributeError:'Sheet'对象没有属性'write'”
- emacs - 有没有办法在公司模式下完成后自动添加空格?