假设我在按日期分区的顶级镶木地板/兽人文件上有一个外部配置单元表,使用该表会对性能产生什么影响
spark.read.parquet("s3a://....").filter("date_col='2021-06-20'")
v/s
spark.sql("select * from table").filter("date_col='2021-06-20'")
读入数据帧后,会进行一系列的转换和聚合。
<块引用>spark 版本:2.3.0 或 3.0.2
蜂巢版本:1.2.1000
每天的记录数:300-700 百万
我的预感是,使用上述任一查询时不会有任何性能差异,因为 parquet 本身具有 hive Metastore 可以提供的大部分优化,而 spark 能够使用它。例如,谓词下推,列式存储的优势等。
作为一个后续问题,如果
另外,与 hive 相比,是否有任何情况下直接从 parquet 读取是更好的选择?
答案 0 :(得分:1)
Hive 在这里实际上应该更快,因为它们都有下推,Hive 已经存储了模式。您在此处读取的镶木地板将需要推断合并的模式。您可以通过提供架构使它们大致相同。
您可以通过直接导航到分区来使 Parquet 版本更快。这避免了必须对可用分区进行初始过滤。
这样就可以了:
spark.read.option("basePath", "s3a://....").parquet("s3a://..../date_col=2021-06-20")
请注意,如果您已经有了架构,这将最有效,因为这也会跳过架构合并。
关于您的跟进: