http://2017.qconbeijing.com/presentation/646?utm_source=weibo&utm_medium=infoq&utm_campaign=yj
專題演講嘉賓 :易傑
騰訊社交與效果廣告部檢索系統組主管
在騰訊工作 10 年,一直從事效果廣告的研發工作,對互聯網廣告及精准推廣有較深理解,具備優秀的互聯網海量運營經驗。
現負責騰訊社交廣告平台百億級廣告引擎系統,OLAP 系統 PivotEngine 等。
SPA 自研 PivotEngine 可以在 2 秒內完成。
數據是很多業務的核心驅動力之一。對於“SPA”這樣的廣告業務,更是如此。幾十億用戶,每天幾百億次曝光,都產生大量的數據。對這些數據進行透視分析,發現其中蘊含的一些高層宏觀信息,對於廣告主以及我們自己的產品、運營、策略開發等人員的決策都能提供指導和幫助。
比如廣告主投放一條廣告,他想了解瀏覽了其廣告的這批用戶的年齡是個什么樣的分布,更進一步地,其想對比一下曝光用戶和有點擊行為的用戶,比如曝光中 25 歲的用戶占比是 10%,但是點擊中 25 歲的用戶占比卻高達 15%。
對於運營來說,他們可能想了解一段時間整個系統中獲得不同曝光次數的用戶的占比、點擊率、產生的收入等。比如最近 10 天內產生 1 次曝光的用戶的數量、平均點擊率、收入,2 次曝光用戶的數量、平均點擊率、收入等。
對於廣告主的這種簡單需求,通過 SQL 可以這樣得到結果:
select age, count(*) from log where advertiser_id=xxx group by age
對於后面那種按曝光量聚合統計的需求來說,假設每條曝光日志作為一條基本的數據,那么 sql 大概是如下這種形式的兩層 GROUP BY 嵌套查詢:
SELECT
exposure_num,
COUNT(*) as user_num,
SUM(sum_click) / SUM(exposure_num) as click_rate,
SUM(sum_cost) AS total_cost
FROM
(SELECT
qq,
COUNT(*) AS exposure_num,
SUM(click_count) AS sum_click,
SUM(cost) AS sum_cost
FROM
log_table
GROUP BY qq) temp_table
GROUP BY exposure_num;
如果只有幾十萬或幾百萬條數據,也許 mysql 就可以很好的解決這個問題。但是當數據規模達到幾十億、幾百億甚至上千億時,mysql 就無法處理了。此外 mysql 一行數據在一列上只能取一個值,但是對於一個用戶來說,其某個屬性可能是多值,比如用戶的商業興趣,會有多個值。這時按照“商業興趣”這一列進行 group by,mysql 也無法或者不方便處理。
為了高效低成本地支持這種簡單的“過濾-聚合”模式,也即“where-group by-(count|sum|avg) ”這種模式的查詢分析請求,當然易用也是非常重要的,我們自研了一套在線查詢分析引擎“PivotEngine”。
