在 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 查询中使用临时表的主要内容,如果未能解决你的问题,请参考以下文章

SQL临时表使用

mysql数据库怎么把查询出来的数据生成临时表

SQL SERVER 临时表能使用EXEC SP_spaceused 查询表大小么

Mysql 临时表 视图

Spark:在查询中两次使用临时表?

查看或临时表 - 在 MS SQL Server 中使用哪个?