问题描述
我需要以有效的方式执行Sparksql语句。例如。编译一次,执行多次(使用不同的参数值)。
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%基于火花的解决方案