【问题标题】:How to bucket a Hive table with ORC for a complex query?如何使用 ORC 存储 Hive 表以进行复杂查询?
【发布时间】:2018-10-23 20:25:49
【问题描述】:

也许这个问题太笼统了,但我认为值得一试。

我正在处理一个包含 270 个字段的表。它按日期划分(如 dt=20180101)。然而,当我们用查询访问这个表时,我们实际上是在进行整个表扫描,因为我们在 where 子句中使用了不是 dt 的字段。我想知道为该表启用分桶的正确方法是什么。我可以选择其中一个 where 子句字段并为此启用分桶。例如:

PARTITIONED BY (
  dt INT
)
CLUSTERED BY (
  class
)
INTO 16 BUCKETS

另一种方法是使用多个字段进行分桶:

PARTITIONED BY (
  dt INT
)
CLUSTERED BY (
  class, other_field, other_field_2
)
INTO 128 BUCKETS

是否值得通过多个字段来支持?我猜它只会在选择中存在相同的确切字段时加快查询速度。

另一个问题,是否值得至少按多个字段排序,以便在读取文件时是顺序读取?像这样:

PARTITIONED BY (
  dt INT
)
CLUSTERED BY (
  class
)
SORTED BY (
  other_field, other_field_2
)
INTO 16 BUCKETS

【问题讨论】:

    标签: hadoop hive orc


    【解决方案1】:

    首先,如果您通常不查询日期并且您的查询跨越多个日期,那么您可能需要更改分区策略。 您不必总是只查询 1 个或几个日期,但如果您的查询通常与“日期”过滤完全无关,那么您应该更改它!

    其次,分桶基本上是根据分桶列的哈希拆分数据。因此,它可以帮助您将数据拆分到文件系统中大小相同的文件夹中,并帮助在其上运行的 mapReduce 程序以有效的方式管理分区。但是,分桶到大量桶中也会产生负面影响,因为所有此类元数据也存储在 Hive 元存储中。因此,当您执行某些查询时首先读取此元数据,并根据元数据查询的结果,从文件系统中读取实际数据(实际数据的一部分)。 所以实际上没有具体的分桶规则;至于应该有多少个桶以及你应该在哪些列上桶。

    所以你应该调查你的查询并做出相应的计划!

    第三,排序在查询时确实有帮助,因为它很容易让引擎下推过滤和排序标准。但是,当您对表启用排序时,数据的摄取实际上会比未启用排序的情况慢一点!但绝对在高查询系统中它一定会给你带来好处。

    总而言之,这三个都是优化技术,对它们的应用没有任何特定的规则。这完全取决于您的用例!

    希望这会有所帮助!!

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多