我们都知道 parquet 是面向列的,所以我们可以只得到我们想要的列,并减少IO。但是,如果 parquet 文件存储在HDFS中,我们是否应该先下载整个文件,然后在本地应用列过滤器?例如,如果我们使用spark从HDFS/Hive中读取一个 parquet 列:
spark.sql("select name from wide_table")
我们还是得下载整个 parquet 文件,对吗?或者,也许有一种方法可以在网络传输之前过滤列?
uemypmqf1#
实际上,SparkSQL的一个特性“predicate pushdown“将尝试使用列过滤器来减少spark处理的信息量,从技术上讲,整个hdfs块仍然被读入内存,但它使用智能逻辑只返回相关的结果,这通常在物理计划中调用。您可以通过在查询中使用.explain()来查看该特性是否被使用(并非所有版本的hdfs都支持此功能)。
.explain()
1条答案
按热度按时间uemypmqf1#
实际上,SparkSQL的一个特性“predicate pushdown“将尝试使用列过滤器来减少spark处理的信息量,从技术上讲,整个hdfs块仍然被读入内存,但它使用智能逻辑只返回相关的结果,这通常在物理计划中调用。您可以通过在查询中使用
.explain()
来查看该特性是否被使用(并非所有版本的hdfs都支持此功能)。