【问题标题】:Performance of pyspark + hive when a table has many partition columns表有很多分区列时pyspark + hive的性能
【发布时间】:2022-01-21 08:26:48
【问题描述】:

我试图了解使用 Spark 查询配置单元表时对分区方案的性能影响。举个例子:

Table 1有3个分区列,数据存放在路径类似

year=2021/month=01/day=01/...data...

Table 2 有 1 个分区列

date=20210101/...data...

有趣的是,我发现对第二种表的查询更快,但我不知道为什么,我也不知道为什么。我想了解这一点,因此我知道如何设计可能具有更多分区的较大表的分区。

正在测试的查询:

select * from table limit 1

我意识到这不会从任何类型的查询修剪中受益。


以上是作为示例查询来演示我想要理解的内容。但万一细节很重要

  • 这是使用 s3 而不是 HDFS
  • 表中的数据很小,没有大量的partitons
  • 对第一个表运行查询的时间约为 2 分钟,第二个约为 10 秒
  • 数据存储为镶木地板

【问题讨论】:

  • 快多少?
  • 你在写什么类型的查询?
  • Hdfs 或 s3......
  • 我的观察基于 S3 和从完整片段中选择少量行的简单查询(即选择 * 限制 1)。这些不是现实的查询,只是测试。
  • 为问题添加了一些细节

标签: apache-spark pyspark hive hive-partitions


【解决方案1】:

除了您未提及的所有其他因素:存储类型、配置、集群容量、每种情况下的文件数量外,您的分区架构与用例不对应。

应根据如何选择数据或如何写入数据或两者来选择分区架构。在您的情况下,分别按年、月、日进行分区是过度分区。 Hive 中的分区是分层文件夹,应遍历所有分区(即使仅使用元数据)以确定数据路径,在单个日期分区的情况下,仅读取一个目录级别。另外两个文件夹:year+month+day 而不是 date 对分区修剪没有帮助,因为所有列都是相关的,并且总是在 where 中一起使用。

此外,分区修剪可能根本不适用于 3 个分区列和如下谓词:where date = concat(year, month, day) 使用 EXPLAIN 并检查它并与这样的谓词进行比较where year='some year' and month='some month' and day='some day'

如果在大多数查询中,WHERE 子句中还有一列,例如 category,它与 date 不相关并且数据很大,那么附加分区是有意义的,你然后将受益于分区修剪。

【讨论】:

  • 正确理解。这个例子有点滑稽,但我用它作为例子是因为在这种情况下,两个选项的等价性很明显,我想了解性能。
  • 遍历更深的层次结构会很昂贵是有道理的,但它通常会引起注意似乎令人惊讶。在此操作期间究竟发生了什么,是否可以获得更多日志或指标,以便我了解导致速度差异的原因
  • 请注意,这些表非常小,这就是差异感觉很大的原因
  • 老实说模糊的答案。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2019-07-29
  • 2018-08-05
  • 2020-01-12
相关资源
最近更新 更多