用于 oracle 子查询的 Pyspark sql
Posted
技术标签:
【中文标题】用于 oracle 子查询的 Pyspark sql【英文标题】:Pyspark sql for oracle subquery 【发布时间】:2020-01-10 21:42:26 【问题描述】:如何将以下基于 oracle 的 sql 查询写入等效的 pyspark sql,因为这是由于嵌套在 spark.sql(*query) 下而不受支持 有没有办法使用 pyspark 数据框来编写这个?
SELECT TABLE1.COL1
FROM TABLE1
WHERE COL2 = (
SELECT MAX(COL2)
FROM TABLE1
WHERE TABLE1.COL3 = TABLE2.COL3 OR TABLE1.COL4 = TABLE2.COL4
)
TABLE1 有列 COL1, COL2, COL3, COL4
TABLE2 有列COL3, COL4
【问题讨论】:
【参考方案1】:如果您使用 JDBC 驱动程序,您能否使用此语法:
sql_request = "(select TABLE1.COL1 FROM TABLE1 WHERE COL2 = (SELECT MAX(COL2) FROM TABLE1 WHERE TABLE1.COL3 = TABLE2.COL3 OR TABLE1.COL4 = TABLE2.COL4))"
df_request = spark.read.jdbc(url=url,table=sql_request,properties=db_properties)
希望对你有帮助
【讨论】:
有什么办法可以使用 pyspark sql 或 pyspark dataframe 吗? 也许我可以建议这些链接:realdbamagic.com/spark-sql-and-oracle-database-integration 或 medium.com/@usmanazhar4/… 或 gokhanatil.com/2018/04/… 开始??【参考方案2】:你可以试试这个。
from pyspark.sql.functions import max
table1.select(table1.COL1)\
.where(table1.COL2 == table2.select(max(table2.COL2).alias('MAX_COL2'))\
.where((table1.COL3 == table2.COL3) | (table1.COL4 == table2.COL4)).collect().head().MAX_COL2).show()
希望这能有所帮助。
【讨论】:
以上是关于用于 oracle 子查询的 Pyspark sql的主要内容,如果未能解决你的问题,请参考以下文章
PySpark:如何添加数据来自查询的列(类似于每行的子查询)