2

数据库中索引的工作方式:参考 Xenph Yan 的答案

在表中的字段上创建索引会创建另一个数据结构,该结构包含字段值和指向与其相关的记录的指针。然后对该索引结构进行排序,允许对其执行二进制搜索。

我理解 ORC 索引的方式是,ORC 每 10'000 行(默认情况下)保留有关行的统计信息(最小值、最大值、总和),如果我查询数据,它会查看统计信息以确定是否需要读取行块与否。

那么ORC索引不对数据进行排序是否正确?

我有一个 69 列的大表,其中包含非常非结构化的数据,我希望能够对每一列执行临时查询。为此,我希望能够通过索引(或至少其中大多数)对每一列进行排序。快速查询的数据中没有“关键”列。

4

2 回答 2

1

根据Cloudera 支持论坛

ORC 索引有两种形式,始终创建的标准索引(每列的每个步幅的最小/最大值)和布隆过滤器。

普通索引适用于范围查询,并且在对数据进行排序时工作得非常好。这通常在任何日期列或增加的列(如 ids)上是自动的。

布隆过滤器非常适合对未排序数据的 URL、名称等进行相等查询。(即客户名称有时会出现在数据中)。

但是,Bloom 过滤器需要一些时间来计算,在索引中占用一些空间,并且对于数据仓库中的大多数列(诸如利润、销售额等数字字段)都不能很好地工作,因此它们不是默认创建的,需要为列启用:

orc.bloom.filter.columns

步幅大小是指 ORC 读取器在基于这些索引的读取操作期间可以跳过的数据块。10000 通常是一个很好的数字,增加它对您没有多大帮助。

http://www.slideshare.net/BenjaminLeonhardi/hive-loading-data

于 2020-02-22T12:40:12.717 回答
-2

Hive 被设计为一个伪 SQL 前端,用于在(大量)数据集上运行(长)批处理作业。您可以运行“临时查询”,但忘记“快速”

此外,当您索引数据库中的列(即CREATE INDEXSQL 中的命令)时,您索引的是每一行的完整、准确的值。如果您的数据确实是“非结构化的”,那可能毫无意义。

所以...如果您需要的是全文搜索,为什么不将所有数据转储到 ElasticSearch 或 Solr 之类的东西中呢?

于 2015-08-10T20:29:43.460 回答