在广告投放的全链路漏斗里,存在着这样一系列环节,先是流量请求,接着是流量识别,然后是广告召回,再之后是出价竞价,随后是胜出反馈,之后是展示,再之后是点击,最后是数据回收,这些环节构成了完整闭环。
这一篇,是广告进行投流系列当中最初的那一篇,将整个那样的所谓漏斗给予了完整的梳理情形,并且朝着所指明的展示到点击这个阶段,把StarRocks的实时分析能力作为了聚焦的要点方面,去解决出价以及素材实时有着监控需求,和素材方面创意展开优选这两个大的难题情况。与此同时,结合起Pinterest真实存在的生产案例,对方案于亿级规模的广告各类场景之下落地之后所能呈现的效果予以展示。
一、广告投放完整漏斗分析
广告投流从本质上来说,是属于多阶段漏斗的范畴,其中每一个环节都存在着损耗情况,在本文里,StarRocks方案主要是为了服务阶段三的实时监控以及决策,与此同时,还会凭借分钟级数据反馈,反过来对阶段一、二的召回以及出价优化起到促进作用。
1.1 阶段一:请求阶段(流量进入→识别→召回→出价)
流量进入之后,系统最先要做的事情是识别流量,将人群与定向进行匹配,然后再开展广告召回以及出价决策。
1.2 阶段二:竞价反馈阶段(胜出通知 → 展示准备)
竞价成功以后,DSP会收到反馈,进而进入投放阶段的展示环节情形,然而竞价成功跟实际展示之间存在漏斗损失状况(fill rate、超时、可见性等)。
1.3,阶段三,此为展示交互与数据回收阶段,先是进行展示,而后发生点击行为,最终达成转化。
这个阶段是投放交付,进行展示之后出现了点击,数据会实时被回收,进而形成闭环监控以及优化。
1.4 漏斗整体损耗关键点分析
经由上述三个阶段的完备漏斗剖析,能够发现展示至点击阶段的CTR对eCPM排名有着直接影响,它是关乎起量成败的最为关键的变量。在本文之中,StarRocks方案主要是针对阶段三的实时监测以及素材的优化选择,与此同时,借助数据闭环来回馈前序的召回以及出价,以此达成全链路的效率提升。
二、业务方案剖析,2.1 经典向来不会过时,eCPM 公式予以拆解,(从广告主的角度来看)。
广告系统的核心竞价公式:
eCPM (effictive cost per miile)=出价*CTR*CVR*1000
在程序化广告(RTB/竞价)中:
本质上,被称作千次展示有效收益的 eCPM,是广告系统针对单次展示价值作出的综合预估,它直接决定了广告于竞价排序里的竞争力,即 eCPM 越高,排名就越靠前。而排名越靠前,曝光机会就越多。曝光机会越多,起量便越轻松。
就如同上文所呈现的完整漏斗那样,在展示到点击的这一阶段,CTR是最为关键的变量,提升CTR不但能够直接使得点击成本降低,也就是CPC降低,而且还能够显著提高eCPM,进而在竞价队列里获取到更多胜出的机会,一份拥有高CTR的广告完全能够证实其创意、文案、视觉设计或者目标定向足够吸引用户。
CTR 诊断三类情况:
2.2 适用对象
本方案主要针对广告主的投放团队,针对广告主的增长团队,还针对广告主的运营团队,它特别适宜于以下这些场景。
2.3 业务痛点
在流量获取阶段,运营人员通常面临三大核心痛点:
(1)冷启动困难
新账户上线后,新素材上线后,新计划上线后,平台算法像 oCPM、oCPC、oROI 这类,需要积累足够样本,也就是点击、转化数据,以此来学习并匹配人群。若是没有历史数据,系统就不敢给出优质流量,进而出现曝光很少的情况,导致起量缓慢,接着预算烧得慢或者根本烧不出去。
对于广告主而言,这属于典型的高成本低效率时期,钱花出去了,然而却没有成效,测试的期限被延长,尝试错误所需要付出的成本很高。
(2)素材衰退
由于素材出现衰退现象,具体表现为老素材的CTR下滑,这是因为用户产生了审美疲劳,进而导致eCPM下降,eCPM下降又引致排名下跌,排名下跌使得曝光量减少,曝光量减少最终造成量级萎缩。倘若广告主不持续进行创意迭代,那么ROI将会崩溃。
(3)空跑浪费
空跑,呈现出高曝光的态势然而点击量却低,或者是毫无转化的情况,进而致使预算白白耗费,也就是产生了无效流量。这会径直引发广告主的 CPA 急剧上涨、ROI 呈现负值,甚至在平台有成本保障的时候还会出现赔付现象。优化师经常遭遇的事故有“账户总是空跑”“计划前端转化良好而后端表现欠佳”“预算瞬间超出但却没有转化”。这些同样都是广告主、代理商以及优化师普遍面临的痛点。
2.4 业务目标
通过数据驱动的方式,实现以下三个核心目标:
2.5 相关指标设计
三、场景实践 1:借助 StarRocks 搭建实时指标监控,达成创意与渠道以及地域和人群标签 CTR 趋势监控,并且实现分钟级智能告警,3.1 场景描述。
专注于广告投放的团队,得针对不同的创意,以及渠道、地域、人群标签所呈现的 CTR 趋势,去展开实时监控之举。一旦出现某个创意的 CTR 陡然下降,且下降幅度超过 20%的情况,又或者某个渠道的 CTR 呈现出异常上升态势,然而人群转化却并未得到提升之时,系统理应在分钟级别的时间范围内发出告警信号。
广告主投放团队在起量阶段常见的常见需求:
StarRocks:把等数据、人工盯盘变成实时智能决策引擎
3.2 架构设计
选取Flink与StarRocks架构,使用明细模型以及物化视图进行选型。
在广告实时监控这种具备高吞吐特性、Append - only的场景里面,我们挑选了Duplicate Key(明细模型)与异步物化视图的组合方案。3.3方案设计,句末有标点符号。
数据流式 append 方式,将曝光以及点击数据写入 StarRocks 明细表,针对每条广告展示事件,实时更新聚合表。
(1)明细表设计
CREATE TABLE fact_ad_events (
event_time DATETIME NOT NULL,
ad_id BIGINT,
creative_id BIGINT,
campaign_id BIGINT,
creative_version STRING,
channel VARCHAR(64),
region VARCHAR(32),
user_tag VARCHAR(128), -- 人群标签(兴趣/年龄/性别/LTV分层等)
event_type VARCHAR(20), -- 'show' / 'click' / 'convert'
cost DECIMAL(18,6),
user_id BIGINT
)
DUPLICATE KEY(event_time, ad_id, creative_id)
PARTITION BY RANGE (event_time) ()
DISTRIBUTED BY HASH(ad_id) BUCKETS 64
PROPERTIES ("replication_num" = "3");
(2)创建异步物化视图,每分钟刷新
CREATE MATERIALIZED VIEW agg_ad_realtime
PARTITION BY date_trunc('minute', event_time)
DISTRIBUTED BY HASH(creative_id)
REFRESH ASYNC EVERY (INTERVAL 1 MINUTE)
AS
SELECT
date_trunc('minute', event_time) AS event_minute,
event_time, -- 必须保留原始列,让分区能找到
ad_id,
creative_id,
creative_version,
channel,
region,
user_tag,
COUNT_IF(event_type = 'show') AS impression_count,
COUNT_IF(event_type = 'click') AS click_count,
COUNT_IF(event_type = 'convert') AS convert_count,
SUM(cost) AS cost
FROM fact_ad_events
GROUP BY
date_trunc('minute', event_time),
event_time, -- 对应上面保留的列
ad_id,
creative_id,
creative_version,
channel,
region,
user_tag;
步骤(3)含指标监控一项,此监控的具体内容为,其一为素材优选,其二是对于其中高CTR的新素材,其三是基于上述情况要及时增加预算。
WITH ranked_new_material AS (
SELECT
creative_id,
creative_version,
channel,
user_tag,
SUM(click_count) AS click_counts,
SUM(impression_count) AS impression_count,
ROUND(SUM(click_count) * 100.0 / NULLIF(SUM(impression_count), 0), 2) AS ctr_percent,
RANK() OVER (PARTITION BY channel ORDER BY
ROUND(SUM(click_count) * 100.0 / NULLIF(SUM(impression_count), 0), 2) DESC
) AS ctr_rank
FROM agg_ad_realtime
WHERE event_minute >= NOW() - INTERVAL 1 HOUR
AND creative_version LIKE '%new%' -- 新素材标识
GROUP BY creative_id, creative_version, channel, user_tag
HAVING SUM(impression_count) >= 10 -- 先过滤低曝光素材,提升性能
)
SELECT
creative_id,
creative_version,
channel,
user_tag,
impression_count,
ctr_percent,
ctr_rank
FROM ranked_new_material
WHERE ctr_rank <= 5
AND ctr_percent >= 4.0 AND impression_count >= 20;
ORDER BY channel, ctr_rank; -- Top5 且 CTR≥4%(行业可调), 且曝光至少300才参与排名
DEMO 执行示意
该项为指标监控 2,要查询最近 60 分钟的多维 CTR 趋势,查询响应要达到毫秒级。
SELECT
event_minute,
creative_id,
creative_version,
channel,
region,
user_tag,
impression_count,
click_count,
ROUND(click_count * 100.0 / NULLIF(impression_count, 0), 2) AS ctr_percent,
ROUND(convert_count * 100.0 / NULLIF(click_count, 0), 2) AS cvr_percent
FROM agg_ad_realtime
WHERE event_minute >= NOW() - INTERVAL 60 MINUTE
ORDER BY event_minute DESC, ctr_percent DESC;
DEMO 执行示意
(5)异常监控 1,凭借 StarRocks 的窗口函数来计算移动平均,进而识别 CTR 突降 20%这类异常。
WITH ctr_trend AS (
SELECT creative_id, creative_version,
ROUND(click_count * 100.0 / NULLIF(impression_count, 0), 2) AS ctr_percent,
AVG(ROUND(click_count * 100.0 / NULLIF(impression_count, 0), 2))
OVER (PARTITION BY creative_id ORDER BY event_minute ROWS BETWEEN 10 PRECEDING AND CURRENT ROW) AS moving_avg
FROM agg_ad_realtime
WHERE event_minute >= NOW() - INTERVAL 30 MINUTE
)
SELECT * FROM ctr_trend
WHERE (moving_avg - ctr_percent) / moving_avg > 0.20
ORDER BY (moving_avg - ctr_percent) DESC;
DEMO 执行示意
(6)异常监控2,通过滑动窗口开展空跑预警,一分钟刷新一回,条件是曝光过万且点击极低。
SELECT creative_id,
creative_version,
impression_count,
click_count,
ROUND(click_count * 100.0 / NULLIF(impression_count, 0), 2) AS ctr_percent
FROM agg_ad_realtime
WHERE impression_count > 10000
AND click_count < 50
AND event_minute >= NOW() - INTERVAL 10 MINUTE;
四、场景实践二:基于 StarRocks 的创意 A 与 B 的测试以及多版本之间的对比,4.1 场景的描述。
广告主会同时去投放三到五个不一样版本的创意素材出来,得要快速地识别出哪一个版本的CTR是最高的呢。A/B测试有着要求,流量要均匀地分配到各个版本当中去,实时地对比各个版本的曝光量、点击量以及CTR,在达到统计显著性之后(一般情况下是需要1000+的转化或者10000+的曝光)才决定胜出版本,并且关闭低劣版本,以此来避免预算继续浪费在低效创意之上的呀。
用户核心诉求如下:
StarRocks 核心优势:助力把握最佳决策期
传统方案需导出数据,然后运用Python或者R去跑卡方,接着等待好长一段时间,结果常常会错过最佳决策窗口。StarRocks能够支持把SQL进行一键计算,在亚秒级的时间内得出结果,并且物化视图每分钟都会自动刷新。
由于 StarRocks 的作用,A/B 测试的情况发生了改变,不再是“等数据、跑脚本”这样的状况 ,而是能够快速实现分钟级科学决策,投放团队在分钟级的时间内,就可以看到一种信息,即“版本 B 的卡方值是 18.7,已经显著胜出”,基于这种情况,会立刻关停劣版。
4.2 架构设计
借助Flink以及StarRocks这种异步物化视图的架构方式来进行操作。
4.3 方案设计
(1)异步物化视图定义
CREATE MATERIALIZED VIEW agg_ad_abtest
PARTITION BY event_minute -- 直接用别名分区(3.1+ 支持)
DISTRIBUTED BY HASH(creative_id, creative_version)
REFRESH ASYNC EVERY (INTERVAL 1 MINUTE)
AS
SELECT
date_trunc('minute', event_time) AS event_minute,
campaign_id,
creative_id,
creative_version,
channel,
region,
user_tag,
COUNT_IF(event_type = 'show') AS impression_count,
COUNT_IF(event_type = 'click') AS click_count,
COUNT_IF(event_type = 'convert') AS convert_count
FROM fact_ad_events
GROUP BY
date_trunc('minute', event_time), -- 对应 event_minute
creative_id,
creative_version,
campaign_id,
channel,
region,
user_tag;
(2)实时多维对比看板
SELECT
creative_version,
channel,
region,
user_tag,
SUM(impression_count) AS impressions,
SUM(click_count) AS clicks,
ROUND(SUM(click_count) * 100.0 / NULLIF(SUM(impression_count), 0), 2) AS ctr_percent,
ROUND(SUM(convert_count) * 100.0 / NULLIF(SUM(click_count), 0), 2) AS cvr_percent
FROM agg_ad_abtest
WHERE event_minute >= NOW() - INTERVAL 24 HOUR
GROUP BY creative_version, channel, region, user_tag
ORDER BY ctr_percent DESC;
Demo执行示意
(3)统计显著性自动判断(卡方检验,胜出决策核心)
WITH stats AS (
SELECT creative_version,
SUM(impression_count) AS imp,
SUM(click_count) AS clk
FROM agg_ad_abtest
WHERE campaign_id = 1234
AND creative_version IN ('V1_old','V1_new','V2_old','V2_new')
AND event_minute >= NOW() - INTERVAL 12 HOUR
GROUP BY creative_version
)
SELECT a.creative_version AS winner, b.creative_version AS loser,
ROUND(a.clk*100.0/a.imp,2) AS ctr_a,
ROUND(b.clk*100.0/b.imp,2) AS ctr_b,
POWER(a.clk - a.imp*p,2)/(a.imp*p) + POWER(b.clk - b.imp*p,2)/(b.imp*p) AS chi_square
FROM stats a CROSS JOIN stats b
CROSS JOIN (SELECT SUM(clk)*1.0/SUM(imp) AS p FROM stats) total
WHERE a.creative_version != b.creative_version
HAVING chi_square > 0.003 AND ctr_a > ctr_b;
Demo执行示意
(4)分时段细分分析
某美妆品牌察觉到,创意 A 在晚上 8 点至 10 点这个时间段,CTR 是最高的,与此同时,创意 B 在中午时段展现出了比其他时段更好的表现。StarRocks 的分时段分析起到了助力作用,帮助达成了 Dayparting 策略,达成了在不同时段投放不一样创意的效果:
SELECT
HOUR(event_time) as hour_of_day,
creative_version,
COUNT(CASE WHEN event_type='impression' THEN 1 END) as impressions,
COUNT(CASE WHEN event_type='click' THEN 1 END) as clicks,
ROUND(clicks * 100.0 / NULLIF(impressions, 0), 2) as ctr_percent
FROM fact_ad_events
WHERE campaign_id = 1234
AND event_time >= date_sub(NOW(), INTERVAL 7 DAY)
GROUP BY hour_of_day, creative_version
ORDER BY hour_of_day, creative_version;
Demo执行示意
五、案例:Pinterest 广告主报表重构
处在全球非常知名的图片社交平台Pinterest里,在广告主报表的那种场景当中,也历经了类似于这样的架构升级事项呢。
5.1 背景与痛点
海量广告主为Pinterest所有,其提供的Partner Insights工具,目的在于助力广告主借由自定义仪表板去查看广告的实时表现,像是曝光、点击、CTR这些情况。在原来的架构里,Pinterest运用Druid来存储以及提供实时洞察数据。伴随广告业务规模的不断扩大,广告商对于实时性、自定义分析能力以及成本效率的要求,越发地提高了,这样一来,原架构就面临了严峻挑战:
5.2 解决方案
Pinterest把Partner Insights的底层分析引擎转移到StarRocks,借助StarRocks的SQL能力替换Druid的JSON查询DSL,还要构建统一的低延迟分析层,直接接入广告曝光以及点击流数据。核心优化点:
新的架构图如下:
5.3 方案收益
搬迁到 StarRocks 之后,Pinterest 于广告报表这一情景当中收获了明显的效益:
性能得以提升,P90查询延迟下降了50%,此情形下广告主查看报表的体验愈发顺畅丝滑。
1. 成本出现大幅降低的情况,2. 所需实例数量减少了百分之六十八,3. 也就是仅为原来的百分之三十二,4. 性价比得到大幅提升。
3. 数据极其迅速地呈现鲜活状态:把原来处于分钟级或者小时级的数据新鲜度,提升到了 10 秒级,进而广告主能够看到在 10 秒之前所发生的广告曝光数据。
经标准 SQL 提取数据,省却 JSON 配置麻烦,简化客户 Onboarding 流程,广告主实时决策效率大幅提升。
总结
我们来改写一下:广告投放的实质是于不确定性之中讯速迭代决策,其每一回的数据分析都理应转变为可被执行的策略,借助引入 StarRocks,于流量获取的阶段将起量监控转变为实时智能决策引擎,使得 CTR 以及 eCPM 确实跑赢竞品。
具体收益如下:
冷启动成本显著降低,采用向量召回以及实时监控的方式,将测试周期从以“天”为单位,压缩至“分钟级”,极大地削减了试错开销,进而提升了CTR。
2. 运营效率成倍增加:进行秒级的监控,发出异常预警,展开精准的人群分析,这样子能让团队从“拉数”当中解脱出来,进而专注于策略以及创意的迭代。
下期预告:广告投流的第二场战斗——怎么办利用 StarRocks 去把“转化归因”以及“ROI 实时计算”这些难题给解决掉呢?请大家满怀期待地等候。

相关标签: # 广告投流 # StarRocks # 实时分析 # CTR监控 # 素材优选