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

问题描述

我需要以有效的方式执行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))

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

解决方法

根据数据的存储位置,群集资源,表的大小等,您可能考虑对整个表进行缓存,这将至少避免火花不得不读取磁盘/每次执行查询时都会存储Blob

catalog = sparkSession.catalog

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

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

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