通过 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 从配置单元视图与配置单元表读取时的性能考虑的主要内容,如果未能解决你的问题,请参考以下文章

来自 Spark / Dataframes 的 AWS SSE-KMS 加密

如何在与导航栏标题的前沿相同的集合视图单元格中配置间距?

使用自定义集合视图布局快速配置动态单元格高度

如何在配置单元中为结构字段创建视图

数组列值与配置单元中的正常列值之间的比较

如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?