带变量的 SQL 编译语句的 SparkSQL 等效项

Posted

技术标签:

【中文标题】带变量的 SQL 编译语句的 SparkSQL 等效项【英文标题】:SparkSQL equivalent for SQL compiled statement with variables 【发布时间】:2020-08-11 13:42:39 【问题描述】:

我需要高效地执行 SparkSQL 语句。例如。一次编译,多次执行(使用不同的参数值)。

对于一个简单的 SQL 示例:

select * from my_table where year=:1

其中 :1 是一个绑定变量,因此该语句只编译一次,并执行 N 次(使用不同的值),我需要相同的 SparkSQL 等价物。

类似的东西:

year = 2020
df_result = spark.sql("select * from my_table where year=0".format(year))

不是我所期望的,因为不是真正的绑定变量,而只是一个特定的实例化句子

【问题讨论】:

为什么需要这个?为了表现?我想您会发现带有字符串插值的示例将为您提供快速而良好的服务。 确实是在性能方面。如果您碰巧执行了此语句数千次,那么可以看看替代方法以避免每次都重新计算该语句。 【参考方案1】:

根据您的数据存储位置、集群资源、表大小等...您可能考虑缓存整个表,这至少可以防止 spark 必须读取磁盘/每次执行查询时的 blob 存储

catalog = sparkSession.catalog

if catalog.isCached("my_table")):
  df_my_table.cache()

df_result = df_my_table.filter("year='" + str(year) + "'")

根据您的架构,可能有很多方法可以更好地做到这一点,但我在这里坚持使用 100% 基于 Spark 的解决方案

【讨论】:

以上是关于带变量的 SQL 编译语句的 SparkSQL 等效项的主要内容,如果未能解决你的问题,请参考以下文章

Datagrip:带参数在oracle中执行sql语句

spark sql架构和原理——和Hive类似 dataframe无非是内存中的table而已 底层原始数据存储可以是parquet hive json avro等

SparkSQL的3种Join实现

Web常见漏洞及修复建议

预编译sql语句就sql绑定变量吗

预编译sql语句就sql绑定变量吗