数据库索引的工作方式:参考Xenph Yan的回答
在表中的一个字段上创建索引会创建另一个数据结构它保存字段值,以及指向它所关联的记录的指针。然后对该索引结构进行排序,从而允许二进制搜索
我理解ORC索引的方式是,ORC保持统计数据(最小,最大,总和)关于每10'000行(默认情况下),如果我查询数据,它会查看统计数据,以确定是否需要读取行块。
那么ORC索引不排序数据是正确的吗?
我有一个69列的大表非常非结构化的数据,我希望能够对每一列执行临时查询。为此,我希望能够通过索引对每一列进行排序(或者至少对其中的大部分)。在快速查询的数据中没有'key'列
根据Cloudera支持论坛:
ORC索引有两种形式,一种是一直创建的标准索引(每个列的每个步的最小/最大值),另一种是Bloom过滤器。
普通索引对于范围查询很好,如果数据是排序的,则工作得非常好。这通常在任何日期列或递增列(如id)上自动执行。
Bloom过滤器对于url、名称等未排序数据的相等性查询非常有用。(例如,有时数据中可能会出现客户名称)。
然而,Bloom过滤器需要一些时间来计算,在索引中占用一些空间,并且不适合数据仓库中的大多数列(数字字段,如利润,销售等)。因此,它们不是默认创建的,需要为列启用:
orc.bloom.filter.columns
跨步大小是指在基于这些索引的读操作期间,ORC阅读器可以跳过的数据块。10000通常是一个很好的数字,再增加也没有多大帮助。
http://www.slideshare.net/BenjaminLeonhardi/hive-loading-dataHive被设计成一个伪sql前端,用于在(海量)数据集上运行(长)批处理作业。您可以运行"特设查询",但忘记"快速"。
此外,当您索引数据库中的列(即SQL中的CREATE INDEX
命令)时,您索引的是每行的整个精确值。如果您的数据确实是"非结构化",那么这可能没有意义。
所以…如果你需要的是全文搜索,为什么不把你所有的数据转储在ElasticSearch或Solr之类的东西中呢?