通过Dataframe从配置单元视图与配置单元表读取时的性能考虑

o2g1uqev  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(344)

我们有一个视图可以合并多个配置单元表。如果我在pyspark中使用sparksql并读取该视图,与直接从表中读取相比,会有任何性能问题。在hive中,如果不将where子句限制为一个精确的表分区,我们就有了一个称为full table scan的东西。spark是否足够智能,可以直接读取包含我们要查找的数据的表,而不是搜索整个视图?请告知。

oogrdqng

oogrdqng1#

你说的是分区修剪。是spark支持它spark在指定分区过滤器时自动忽略读取的大数据。
当一个表中的数据被分割到多个逻辑分区时,分区修剪是可能的。每个分区对应于分区列的特定值,并作为子目录存储在hdfs的表根目录中。在适用的情况下,只查询表中所需的分区(子目录),从而避免不必要的i/o
在对数据进行分区之后,当在 predicate 中引用分区列时,后续查询可以省略大量的i/o。例如,以下查询将自动定位并加载peoplepartitioned/age=20/下的文件,并忽略所有其他文件:

val peoplePartitioned = spark.read.format("orc").load("peoplePartitioned")
peoplePartitioned.createOrReplaceTempView("peoplePartitioned") 
spark.sql("SELECT * FROM peoplePartitioned WHERE age = 20")

这里提供了更详细的信息
如果对查询运行explain(true),也可以在逻辑计划中看到这一点:

spark.sql("SELECT * FROM peoplePartitioned WHERE age = 20").explain(True)

它将显示spark读取的分区

相关问题