Kyligence Copilot - AI 数智助理,以 AI 变革企业经营与管理! 立即了解更多

大数据 BI 分析之 TopN 功能详解

佘磊
2019年 3月 21日

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

初识TopN功能

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

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

这样一条普通的查询语句,其实只需要定义一个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
关注我们

kyligence