带变量的 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 等效项的主要内容,如果未能解决你的问题,请参考以下文章
spark sql架构和原理——和Hive类似 dataframe无非是内存中的table而已 底层原始数据存储可以是parquet hive json avro等