从 hive vs parquet 读取时的 spark 性能

Performance of spark while reading from hive vs parquet

假设我在按日期分区的 parquet/orc 文件顶部有一个外部配置单元 table,使用

会对性能产生什么影响
spark.read.parquet("s3a://....").filter("date_col='2021-06-20'")

v/s

spark.sql("select * from table").filter("date_col='2021-06-20'")

读入dataframe后,会进行一系列的转换和聚合。

spark version : 2.3.0 or 3.0.2

hive version : 1.2.1000

number of records per day : 300-700 Mn

我的直觉是,使用上述任一查询时不会有任何性能差异,因为 parquet 本身具有 hive metastore 可以提供的大部分优化,并且 spark 能够使用它。比如,谓词下推,列式存储的优点等等

作为后续问题,如果

会发生什么
  1. 基础数据是 csv 而不是 parquet。在顶部设置配置单元 table 会提高性能吗?
  2. Hive table 已分桶。在这种情况下读取底层文件系统而不是从 table 读取是否有意义?

此外,在某些情况下,与配置单元相比,直接从镶木地板读取是更好的选择吗?

Hive 实际上应该更快,因为它们都有下推,Hive 已经存储了架构。您在此处读取的镶木地板将需要推断合并的模式。您可以通过提供架构使它们大致相同。

您可以通过直接导航到分区来使 Parquet 版本更快。这避免了对可用分区进行初始过滤。

所以像这样的事情就可以做到:

spark.read.option("basePath", "s3a://....").parquet("s3a://..../date_col=2021-06-20")

请注意,如果您已经有一个架构,这将最有效,因为这也会跳过架构合并。

关于您的跟进:

  1. 如果它是 CSV,那将有很大的不同,因为它必须解析所有数据,然后过滤掉那些列。 CSV 对于大型数据集来说真的很糟糕。
  2. 不应该真的让你得到那么多,可能会给你带来麻烦。 Hive 存储的元数据可以让 Spark 在这里导航您的数据比您自己尝试更有效。