【问题标题】:Performance consideration when reading from hive view Vs hive table via DataFrames通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑
【发布时间】:2019-10-22 23:20:14
【问题描述】:
我们有一个联合多个 hive 表的视图。如果我在 pyspark 中使用 spark SQL 并读取该视图,那么与直接从表中读取相比,会有任何性能问题。
在 hive 中,如果我们不将 where 子句限制为精确的表分区,我们就会进行全表扫描。 spark 是否足够智能,可以直接读取包含我们正在查找的数据的表,而不是搜索整个视图?
请指教。
【问题讨论】:
标签:
apache-spark
hive
pyspark
apache-spark-sql
pyspark-sql
【解决方案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 读取了哪些分区