从 hive 和 parquet 读取时的火花性能

时间:2021-06-21 16:16:34

标签: apache-spark hive apache-spark-sql parquet

假设我在按日期分区的顶级镶木地板/兽人文件上有一个外部配置单元表,使用该表会对性能产生什么影响

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 能够使用它。例如,谓词下推,列式存储的优势等。

作为一个后续问题,如果

  1. 基础数据是 csv 而不是 parquet。在顶部放置蜂巢表是否可以提高性能?
  2. Hive 表被分桶。在这种情况下读取底层文件系统而不是从表中读取是否有意义?

另外,与 hive 相比,是否有任何情况下直接从 parquet 读取是更好的选择?

1 个答案:

答案 0 :(得分:1)

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

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

这样就可以了:

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

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

关于您的跟进:

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