你的 TopN 数据查询够快吗?

TopN 查询,即从数据中实时查找前N项。当分析师须要排序的维度基数较大时,如从几十万名员工或者几百万个产品中查询TopN时,每每会遇到响应速度缓慢,性能不稳定等问题。这给技术团队带来很大压力。Kyligence Enterprise强大的功能之一就是可在秒级完成TopN数据的返回。本篇将重点介绍这个功能的使用技巧。html

初识TopN功能

在编辑度量的表达式下拉框中,有这样一个选项“TOP_N”。它就是用来在大数据量状况下,为统计排名前N作预计算,从而达到提速百倍的目的的。(具体用法详见产品手册express

假如咱们发送这样一条查询语句(某电商公司须要查询特定时段内交易额最高的前100位卖家):apache

这样一条普通的查询语句,其实只须要定义一个sum度量就能解决(同样可以击中cube,返回结果)。可是,若是咱们有100W的SELLER_ID(这对于不少须要数据分析的公司来讲是小意思),那么就须要先对这100W条记录按SUM(PRICE)进行排序,而后再返回前100条。当SELLER_ID达到千万的时候,你再试试?不去泡杯咖啡(几十秒~几分钟),结果是出不来的。架构

然而,咱们观察到后面有个limit 100,实际上咱们只关心这100W条SELLER_ID中的前100条,那么能够加一个Top度量试试。仍是面对一样的数据量,仍是发送一样的查询语句,但这一次绝对不同。——结果秒级响应,大约是百倍的差别。性能

感受提速百倍是吹出来的?不太相信一个小小TopN度量的价值和能力?请继续往下,邀请你一块儿来见证背后的秘密。大数据

原理揭秘

仍是上面的查询例子,若是不设置TopN度量,数据在CUBE中预计算完之后,会这样保存。
优化

因为查询的日期须要跨越一个月,所以大约须要读取30天*100W=3千万条记录,而后聚合成100W(SELLER_ID)以后,再排名统计出前100条。计算量可想而知。网站

若是咱们在PRICE上增长一个TopN度量,那么数据在CUBE中预计算完之后,会保存成这样。人工智能

SELLER_ID不保存到RowKey上,而是做为TopN度量当中的一个值,按sum(price)排列好的顺序被保存到Measure区域(该区域会根据TopN中N的设置值保存大于N的记录个数)。此时再计算前100条时,只须要取30条(PART_ID)记录进行合并便可。架构设计

同时,这样作带来的好处是,再也不须要将SELLER_ID设置为维度,cuboid中的记录数也会由于不包含高基数维度列而大大减少。

所以,TopN度量的应用场景为,当须要排序的维度基数越大时,效果越明显。

另外,咱们在验证查询中是否利用到了Top N的优化策略,能够在Kyligence的后查询日志中,搜索是否包含以下提示信息。

信息一:

INFO [Query df42d20d-d9e6-4d5f-9c3a-844f4de63d39-135] cube.CubeCapabilityChecker : Cube CUBE[name=kylin_sales_cube] CapabilityInfluences: TOP_SELLER@class org.apache.kylin.measure.topn.TopNMeasureType

信息二:

INFO [Query df42d20d-d9e6-4d5f-9c3a-844f4de63d39-135] topn.TopNMeasureType : Rewrite function FunctionDesc [expression=SUM, parameter=KYLIN.KYLIN_SALES.PRICE, returnType=decimal(19,4)] to FunctionDesc [expression=TOP_N, parameter=KYLIN.KYLIN_SALES.PRICE,KYLIN.KYLIN_SALES.SELLER_ID, returnType=topn(100)]

最后分享两个客户咨询较多的实际案例。

应用案例

  • 查询按单个度量进行排序筛选TopN:

某手机供应商须要统计耗电量排名前100的App应用名称。而App应用的数量接近有80W个,属于超高基数维度。查询语句相似于

该表有接近5000W的记录数,假设咱们只定义维度ApplicationName,ApplicationLevel,DeviceType,Version和度量SUM(BatteryConsume),那么查询结果大约是180秒。

利用TopN的功能后,咱们只须要定义维度DeviceType,Version以及度量TopN(BatteryConsume)+ ApplicationName,ApplicationLevel。查询结果只须要0.7秒。(设置TopN以后的存储结构相似以下:)

  • 查询按单个度量进行排序筛选TopN,但须要同时查看其它度量

假设该手机供应商在统计耗电量排名前100的App应用名称时,也同时想看看它们的使用时长统计值,是否也能利用Top来实现呢?查询语句以下:

因为TopN中,只能保存一个度量,而该查询须要同时显示另外一个度量的统计值,所以该查询没法命中TopN设置。然而,咱们能够改写一下该语句:

同时,将BatteryConsume设置为TopN度量,将TimeConsume设置为普通的sum度量。这样,子查询的第一部分就能击中TopN度量了,而且整个查询不须要排序。

Kyligence Enterprise

Kyligence Enterprise是人工智能加强型的数据管理和分析平台。其智能分析引擎能够自动加速对大规模数据的洞察,显著提升数据工程师和分析师的工做效率。

关于做者

佘磊,Kyligence解决方案组架构师,拥有丰富的BI/数据仓库项目管理及架构设计经验,熟悉数据分析,大数据在各行业中的应用。


联系咱们

网站:kyligence.io/

邮件:info@kyligence.io

电话: +86 21-61060928

相关文章
相关标签/搜索