通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑
Posted
技术标签:
【中文标题】通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑【英文标题】:Performance consideration when reading from hive view Vs hive table via DataFrames 【发布时间】:2019-10-22 23:20:14 【问题描述】:我们有一个联合多个 hive 表的视图。如果我在 pyspark 中使用 spark SQL 并读取该视图,那么与直接从表中读取相比,会有任何性能问题。 在 hive 中,如果我们不将 where 子句限制为精确的表分区,我们就会进行全表扫描。 spark 是否足够智能,可以直接读取包含我们正在查找的数据的表,而不是搜索整个视图? 请指教。
【问题讨论】:
【参考方案1】:您正在谈论分区修剪。 是的,spark 支持它,当指定分区过滤器时,spark 会自动省略大数据读取。
当表中的数据被拆分到多个逻辑分区时,可以进行分区修剪。每个分区对应一个分区列的特定值,并作为子目录存储在 HDFS 上的表根目录中。在适用的情况下,只查询表所需的分区(子目录),从而避免不必要的 I/O
对数据进行分区后,在谓词中引用分区列时,后续查询可以省略大量 I/O。例如,以下查询会自动定位并加载 peoplePartitioned/age=20/ 下的文件并忽略所有其他文件:
val peoplePartitioned = spark.read.format("orc").load("peoplePartitioned")
peoplePartitioned.createOrReplaceTempView("peoplePartitioned")
spark.sql("SELECT * FROM peoplePartitioned WHERE age = 20")
提供更多详细信息here
如果您对查询运行解释(真),您也可以在逻辑计划中看到这一点:
spark.sql("SELECT * FROM peoplePartitioned WHERE age = 20").explain(True)
它会显示 spark 读取了哪些分区
【讨论】:
以上是关于通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑的主要内容,如果未能解决你的问题,请参考以下文章