根据不同的业务场景,可以选择使用不同的技术。
(1)维度相对固定的离线数据查询,可用Kylin。Kylin支持标准SQL,通过预计算将数据转换成Cube,提供高效的多维查询。然而,预计算需要事先定义好表结构和查询模型,查询灵活性较低。
(2)维度更加灵活,并且需要支持实时数据查询是,可用Druid。但Druid不支持SQL查询,与报表系统对接的难度略高。
(3)如果需要高度灵活的自定义查询,可以用Spark SQL完成数据转换、聚合等计算,再将结果输出到报表系统。
多维查询场景需求越来越多,但合适的查询引擎却不太多,如HBase比较适合特定维度的查询, Hive和Spark比较偏重于离线分析场景,Impala在小数据量下进行多维查询效果还不错,但是在大数据量下效率大打折扣。可选的引擎并不多,经过实践经验,以下几种可以做个参考:
1) Kylin
Kylin采用预计算的方式实现多个Cube,多维查询语句经过解析后最终会落到某个Cube中查询,是典型的空间换时间的策略。这种方案的好处是基于Kylin的查询效率极高,缺点是需要定期构建,时效性较差。
2) Elasticsearch
Elasticsearch也是列式存储,核心原理是倒排索引,所以查询效率非常高,多维度查询性能损失并不是很大,缺点是SQL支持不好,官方在6.3后开始支持SQL,但是某些查询仍然受限。所以对于简单的多维度查询,使用Elasticsearch比较适合,而复杂的查询(如多表嵌套、字段的各种函数式处理)暂时还不太合适。
3) Druid
Druid的思路有点像Kylin Cube预计算和倒排索引两个思想的结合(Kylin底层使用HBase存储),查询效率也很不错。
以上几种方案不是多维查询中唯一的选择,也不是哪一种方案就一定适合所有的查询场景,最终还是要以数据实际情况选择合适的引擎。