数据库中索引的工作方式:refering the answer from Xenph Yan
在表中的字段上创建索引会创建另一个数据结构 它包含字段值,以及指向它所涉及的记录的指针。 然后对此索引结构进行排序,从而允许二进制搜索 在它上面进行。
我理解ORC索引的方式是,ORC保持关于每10'000行(默认情况下)行的统计信息(最小值,最大值,总和),如果我查询数据,它会查看统计信息以确定是否存在需要读取行块。
ORC索引不对数据进行排序是否正确?
我有一个69列的大型表,其中包含非结构化数据,我希望能够对每个列执行即席查询。为此,我希望能够通过索引(或至少大部分)对每列进行排序。数据中没有“关键”列可以快速查询。
答案 0 :(得分:0)
ORC索引有两种形式,即始终创建的标准索引(每列的每个步幅的最小/最大值)和布隆过滤器。
普通索引非常适合范围查询,如果对数据进行排序,则正常工作效果非常好。通常在任何日期列或id之类的递增列上都是自动的。
bloom过滤器非常适合对未排序的数据进行URL,名称等类似查询。 (即,有时客户名称可能会出现在数据中)。
但是,动臂过滤器需要花费一些时间来计算,占用索引中的某些空间并且不能很好地用于数据仓库中的大多数列(诸如利润,销售额等数字字段),因此默认情况下不会创建它们需要为列启用
:orc.bloom.filter.columns
跨度大小表示ORC读取器在基于这些索引的读取操作期间可以跳过的数据块。 10000通常是一个很好的数字,增加它并不能帮助您。
http://www.slideshare.net/BenjaminLeonhardi/hive-loading-data
答案 1 :(得分:-1)
Hive被设计为伪(SQL)前端,用于在(大型)数据集上运行(长)批处理作业。您可以运行"即席查询" 但是忘记"快速" 。
此外,当您索引数据库中的列(即SQL中的CREATE INDEX
命令)时,您索引的是每行的完整,准确值。如果您的数据确实是"非结构化" ,那可能毫无意义。
所以...如果您需要的是全文搜索,为什么不将所有数据转储到ElasticSearch或Solr等?