gpt4 book ai didi

hadoop - 如何使用 ORC 存储 Hive 表以进行复杂查询?

转载 作者:可可西里 更新时间:2023-11-01 16:37:29 25 4
gpt4 key购买 nike

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

我正在处理一个包含 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

最佳答案

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

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

因此,您应该研究您的查询并做出相应的计划!

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

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

希望对您有所帮助!!

关于hadoop - 如何使用 ORC 存储 Hive 表以进行复杂查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49069433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com