在 pyspark 查询中使用临时表
Posted
技术标签:
【中文标题】在 pyspark 查询中使用临时表【英文标题】:Using temp tables in pyspark queries 【发布时间】:2019-11-11 15:51:29 【问题描述】:我需要使用 SQL 将一些数据读入 Spark。出于性能原因,该查询确实需要一个临时表。当我尝试使用包含如下所述临时表的查询时,spark 坚持认为存在语法错误,即使这不是真的。
例如,这很好用:
# pre-emptive stuff that loads connection parameters and whatnot
query = """
select top 50
*
from DW.Dim.Sales
"""
df = spark.read\
.format("jdbc")\
.option("url", url)\
.option("query", query)\
.option("user", 'svcDataBricks_DEV')\
.option("password", sql_password)\
.load()
但这会返回错误:
query = """
select top 50
*
into #MyData
from DW.Dim.Sales
"""
df = spark.read\
.format("jdbc")\
.option("url", url)\
.option("query", query)\
.option("user", 'svcDataBricks_DEV')\
.option("password", sql_password)\
.load()
具体是这个错误:
com.microsoft.sqlserver.jdbc.SQLServerException:关键字“into”附近的语法不正确。
我想问题是spark.read()
不是为执行任何类型的写入操作而设计的,但文档有些不透明,所以我不太清楚如何进行这项工作。
【问题讨论】:
您可以在 Spark 中创建临时表吗?您是否有特定原因要在 SQL Server 中创建临时表? @jjayadeep 因为查询需要相当多的数据聚合才能加入主表;将该聚合作为视图运行真的很慢。将其作为临时表运行并添加适当的索引使其性能更高。 【参考方案1】:See my answer over in this SO question.
简而言之,它不起作用,因为驱动程序在你的 Sql 前面加上SELECT * FROM (
并在它后面加上) spark_generated_alias
。这使得你写的语法不正确。您必须通过自己的自定义“Sql 注入攻击”发挥创意才能获得您想要的。
【讨论】:
以上是关于在 pyspark 查询中使用临时表的主要内容,如果未能解决你的问题,请参考以下文章