从 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 能够使用它。比如,谓词下推,列式存储的优点等等
作为后续问题,如果
会发生什么
- 基础数据是 csv 而不是 parquet。在顶部设置配置单元 table 会提高性能吗?
- Hive table 已分桶。在这种情况下读取底层文件系统而不是从 table 读取是否有意义?
此外,在某些情况下,与配置单元相比,直接从镶木地板读取是更好的选择吗?
Hive 实际上应该更快,因为它们都有下推,Hive 已经存储了架构。您在此处读取的镶木地板将需要推断合并的模式。您可以通过提供架构使它们大致相同。
您可以通过直接导航到分区来使 Parquet 版本更快。这避免了对可用分区进行初始过滤。
所以像这样的事情就可以做到:
spark.read.option("basePath", "s3a://....").parquet("s3a://..../date_col=2021-06-20")
请注意,如果您已经有一个架构,这将最有效,因为这也会跳过架构合并。
关于您的跟进:
- 如果它是 CSV,那将有很大的不同,因为它必须解析所有数据,然后过滤掉那些列。 CSV 对于大型数据集来说真的很糟糕。
- 不应该真的让你得到那么多,可能会给你带来麻烦。 Hive 存储的元数据可以让 Spark 在这里导航您的数据比您自己尝试更有效。
假设我在按日期分区的 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 能够使用它。比如,谓词下推,列式存储的优点等等
作为后续问题,如果
会发生什么- 基础数据是 csv 而不是 parquet。在顶部设置配置单元 table 会提高性能吗?
- Hive table 已分桶。在这种情况下读取底层文件系统而不是从 table 读取是否有意义?
此外,在某些情况下,与配置单元相比,直接从镶木地板读取是更好的选择吗?
Hive 实际上应该更快,因为它们都有下推,Hive 已经存储了架构。您在此处读取的镶木地板将需要推断合并的模式。您可以通过提供架构使它们大致相同。
您可以通过直接导航到分区来使 Parquet 版本更快。这避免了对可用分区进行初始过滤。
所以像这样的事情就可以做到:
spark.read.option("basePath", "s3a://....").parquet("s3a://..../date_col=2021-06-20")
请注意,如果您已经有一个架构,这将最有效,因为这也会跳过架构合并。
关于您的跟进:
- 如果它是 CSV,那将有很大的不同,因为它必须解析所有数据,然后过滤掉那些列。 CSV 对于大型数据集来说真的很糟糕。
- 不应该真的让你得到那么多,可能会给你带来麻烦。 Hive 存储的元数据可以让 Spark 在这里导航您的数据比您自己尝试更有效。