如何将 Hive table 与 ORC 一起用于复杂查询?
How to bucket a Hive table with ORC for a complex query?
也许这个问题太笼统了,但我觉得值得一试。
我正在使用具有 270 个字段的 table。它按日期分区(如 dt=20180101)。然而,当我们用查询命中这个 table 时,我们实际上是在进行整个 table 扫描,因为我们在 where 子句中使用了不是 dt 的字段。我想知道为此 table 启用分桶的正确方法是什么。我可以选择其中一个 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
多个字段值不值?我想只有当 select.
中存在相同的确切字段时,它才会加快查询速度
另一个问题,是否值得至少按多个字段排序以便在读取文件时按顺序读取?像这样:
PARTITIONED BY (
dt INT
)
CLUSTERED BY (
class
)
SORTED BY (
other_field, other_field_2
)
INTO 16 BUCKETS
首先,如果您通常不按日期查询并且您的查询跨越多个日期,那么您可能想要更改分区策略。
您不必总是只查询 1 个或几个日期,但如果您的查询通常与 'date' 过滤完全无关,那么您应该改变它!
其次,分桶基本上是根据分桶列的散列来拆分数据。因此,它可以帮助您将数据拆分到文件系统中大小相同的文件夹中,并帮助在其上运行的 mapReduce 程序以有效的方式管理分区。但是,分桶到大量桶中也会产生负面影响,因为所有此类元数据也存储在 Hive Metastore 中。因此,当您执行某些查询时,首先读取此元数据,并根据元数据查询的结果,从文件系统中读取实际数据(实际数据的一部分)。
所以实际上没有具体的分桶规则;至于应该有多少个桶,以及你应该在哪些列上桶。
所以您应该调查您的问题并做出相应的计划!
第三,排序在查询时确实有帮助,因为引擎很容易下推过滤和排序标准。但是,当您在 table 上启用排序时,数据的摄取实际上会比未启用排序的情况慢一点!但肯定在高查询系统中一定会给你带来不错的收益。
所以总而言之,这三个都是优化技术,没有任何特定的应用规则。这完全取决于您的用例!
希望对您有所帮助!!
也许这个问题太笼统了,但我觉得值得一试。
我正在使用具有 270 个字段的 table。它按日期分区(如 dt=20180101)。然而,当我们用查询命中这个 table 时,我们实际上是在进行整个 table 扫描,因为我们在 where 子句中使用了不是 dt 的字段。我想知道为此 table 启用分桶的正确方法是什么。我可以选择其中一个 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
多个字段值不值?我想只有当 select.
中存在相同的确切字段时,它才会加快查询速度另一个问题,是否值得至少按多个字段排序以便在读取文件时按顺序读取?像这样:
PARTITIONED BY (
dt INT
)
CLUSTERED BY (
class
)
SORTED BY (
other_field, other_field_2
)
INTO 16 BUCKETS
首先,如果您通常不按日期查询并且您的查询跨越多个日期,那么您可能想要更改分区策略。 您不必总是只查询 1 个或几个日期,但如果您的查询通常与 'date' 过滤完全无关,那么您应该改变它!
其次,分桶基本上是根据分桶列的散列来拆分数据。因此,它可以帮助您将数据拆分到文件系统中大小相同的文件夹中,并帮助在其上运行的 mapReduce 程序以有效的方式管理分区。但是,分桶到大量桶中也会产生负面影响,因为所有此类元数据也存储在 Hive Metastore 中。因此,当您执行某些查询时,首先读取此元数据,并根据元数据查询的结果,从文件系统中读取实际数据(实际数据的一部分)。 所以实际上没有具体的分桶规则;至于应该有多少个桶,以及你应该在哪些列上桶。
所以您应该调查您的问题并做出相应的计划!
第三,排序在查询时确实有帮助,因为引擎很容易下推过滤和排序标准。但是,当您在 table 上启用排序时,数据的摄取实际上会比未启用排序的情况慢一点!但肯定在高查询系统中一定会给你带来不错的收益。
所以总而言之,这三个都是优化技术,没有任何特定的应用规则。这完全取决于您的用例!
希望对您有所帮助!!