Commit 7ef1fd6b by hejiangming

统一口径从dim_st_detail 拿数据 对于爬虫抓搜索词时 该搜索词没结果的情况用dim的数据对排名相关字段兜底 保证峰值月 常年可卖 趋势图这些字段的数据正常计算

parent 77d145f8
......@@ -48,6 +48,9 @@ class DwtAbaLastChangeRate(object):
self.df_save = self.spark.sql(f"select 1+1;")
# 需求1:近6月排名变化率/变化量(仅 month 类型生效)
self.df_hist_rank = self.spark.sql(f"select 1+1;") # M-1~M-6 历史 rank
# 爬虫漏抓补 rank:dim_st_detail 上月/去年同月 rank,给环比/同比 last_rank/last_year_rank 兜底(仅 month)
self.df_last_month_rank_dim = self.spark.sql(f"select 1+1;") # 上月 rank(dim)
self.df_last_year_rank_dim = self.spark.sql(f"select 1+1;") # 去年同月 rank(dim)
def handle_date_offset(self, handle_type: int):
# handle_type = 0 代表计算环比日期,等于 1 代表计算同比日期
......@@ -168,28 +171,79 @@ class DwtAbaLastChangeRate(object):
month_list = [CommonUtil.get_month_offset(self.date_info, -i) for i in range(1, 7)]
print(f"近6月历史月份列表: {month_list}")
# 一次读 dwt_aba_st_analytics 的 M-1~M-6 历史分区,仅取 search_term + rank
# 用于算 6 个变化量字段 + rank_rate_last_1_month
# 一次读 M-1~M-6 历史分区的 rank,用于算 6 个变化量字段 + rank_rate_last_1_month
# ===== 原逻辑(保留备查):读 dwt_aba_st_analytics 近6月 rank =====
# 问题:dwt = 爬虫∩ABA,某月漏抓 → 该月 rank 缺 → 近6月变化被误判成假下榜(+1e7)/假新进榜(-1e7)。
# sql_hist_rank = f"""
# select
# search_term,
# cast(rank as int) as rank,
# date_info
# from dwt_aba_st_analytics
# where site_name = '{self.site_name}'
# and date_type = '{self.date_type}'
# and date_info in ({CommonUtil.list_to_insql(month_list)})
# and rank > 0
# """
# 【改-一档】换源 dim_st_detail(ABA 清洗表,漏抓月仍有该词 st_rank),近6月排名变化不再出假尖刺
sql_hist_rank = f"""
select
search_term,
cast(rank as int) as rank,
cast(st_rank as int) as rank,
date_info
from dwt_aba_st_analytics
from dim_st_detail
where site_name = '{self.site_name}'
and date_type = '{self.date_type}'
and date_info in ({CommonUtil.list_to_insql(month_list)})
and rank > 0
and st_rank > 0
"""
self.df_hist_rank = self.spark.sql(sql_hist_rank).repartition(40, 'search_term').cache()
print("self.df_hist_rank:")
self.df_hist_rank.show(10, truncate=True)
# 【二档】环比/同比 rank 补漏抓月:读 dim_st_detail 上月、去年同月的 st_rank,
# 在 handle_base / handle_year_ratio 里给 last_rank / last_year_rank 做 coalesce 兜底——
# 对比月被爬虫漏抓(dwt 无该词)时用 dim 真 rank,避免被算成假上升;
# 两端都无(真·新进榜/续断)时仍为 null → 沿用原 na.fill(-1000) 语义。
sql_last_month_rank = f"""
select search_term, cast(st_rank as int) as last_rank_dim
from dim_st_detail
where site_name = '{self.site_name}'
and date_type = '{self.date_type}'
and date_info = '{self.last_date_info}'
and st_rank > 0
"""
self.df_last_month_rank_dim = self.spark.sql(sql_last_month_rank).repartition(40, 'search_term').cache()
# 顺带多取 st_search_num,给同比搜索量变化率 last_year_search_volume 也做漏抓兜底(见 handle_year_ratio)
sql_last_year_rank = f"""
select search_term,
cast(st_rank as int) as last_year_rank_dim,
st_search_num as last_year_search_volume_dim
from dim_st_detail
where site_name = '{self.site_name}'
and date_type = '{self.date_type}'
and date_info = '{self.last_year_date_info}'
and st_rank > 0
"""
self.df_last_year_rank_dim = self.spark.sql(sql_last_year_rank).repartition(40, 'search_term').cache()
def handle_base(self):
self.df_st_base_data = self.df_aba_analytics.join(
self.df_aba_analytics_old, on='id', how='left'
)
# 【二档-环比】last_rank 补漏抓月(仅 month):上月被爬虫漏抓时 dwt 的 last_rank 为 null,
# 用 dim 上月 st_rank(df_last_month_rank_dim,按 search_term)coalesce 兜底 → "漏抓续榜"不再算成假上升;
# 两端都无(真新进榜)时 last_rank 仍 null → 后续 na.fill(-1000) 语义不变。
# (df_st_base_data 已带 search_term,来自当月 df_aba_analytics;按 search_term left join,1:1 不放大)
if self.date_type == DateTypes.month.name:
self.df_st_base_data = self.df_st_base_data.join(
self.df_last_month_rank_dim, on='search_term', how='left'
).withColumn(
'last_rank', F.coalesce(F.col('last_rank'), F.col('last_rank_dim'))
).drop('last_rank_dim')
self.df_last_month_rank_dim.unpersist()
self.df_st_base_data = self.df_st_base_data.withColumn(
'rank_rate_of_change',
F.round((F.col('rank') - F.col('last_rank')) / F.col('last_rank'), 4)
......@@ -218,6 +272,22 @@ class DwtAbaLastChangeRate(object):
df_year_ratio = self.df_st_base_data.join(
self.df_st_last_year_data, on='search_term', how='left'
)
# 【二档-同比】last_year_rank 补漏抓月(仅 month):去年同月被漏抓时 dwt 无该词 → last_year_rank null,
# 用 dim 去年同月 st_rank(df_last_year_rank_dim,按 search_term)coalesce 兜底 → 同比 rank 不再假上升;
# 真·去年没有(dim 也无)时仍 null → 沿用原 na.fill(-1000) 语义。
if self.date_type == DateTypes.month.name:
df_year_ratio = df_year_ratio.join(
self.df_last_year_rank_dim, on='search_term', how='left'
).withColumn(
'last_year_rank', F.coalesce(F.col('last_year_rank'), F.col('last_year_rank_dim'))
).withColumn(
# 同比搜索量变化率同样补漏抓月:去年同月漏抓时 dwt 的 last_year_search_volume 为 null,
# 用 dim 的 st_search_num(last_year_search_volume_dim)coalesce 兜底,避免 search_volume_change_rate 假上升(na.fill 1000);
# 真·去年没有(dim 也无)时仍 null → 沿用原 na.fill 语义。
'last_year_search_volume',
F.coalesce(F.col('last_year_search_volume'), F.col('last_year_search_volume_dim'))
).drop('last_year_rank_dim', 'last_year_search_volume_dim')
self.df_last_year_rank_dim.unpersist()
df_year_ratio = df_year_ratio.withColumn(
"rank_change_rate",
F.round(F.expr("(rank - last_year_rank) / last_year_rank"), 4)
......
......@@ -535,12 +535,28 @@ class DwtAbaStAnalytics(Templates):
# 读自身历史 11 个月分区的 rank,用于计算峰值月 peak_month / 常年可卖 all_year_text_flag
# ============================================================
last_11_month = [CommonUtil.get_month_offset(self.date_info, -i) for i in range(1, 12)]
# ===== 原逻辑(保留备查):读 dwt_aba_st_analytics 近11月 rank =====
# 问题:dwt_aba_st_analytics = 爬虫 ∩ ABA(inner join),某月爬虫漏抓 → 该词该月无行 →
# peak_month/常年可卖(all_year_text_flag)被漏抓月带偏(峰值月算错、常年可卖误判为否)。
# sql = f"""
# select
# search_term,
# rank,
# date_info
# from dwt_aba_st_analytics
# where site_name = '{self.site_name}'
# and date_type = 'month'
# and date_info in ({CommonUtil.list_to_insql(last_11_month)})
# """
# 【改】换源 dim_st_detail(ABA 清洗表,dwt 的 rank 本就取自它的 st_rank):
# dim_st_detail 不经爬虫过滤,漏抓月 ABA 侧仍有该词行 →
# 峰值月/常年可卖按 ABA 的 presence + 真实 rank 计算,不再受爬虫漏抓影响。
sql = f"""
select
search_term,
rank,
st_rank as rank,
date_info
from dwt_aba_st_analytics
from dim_st_detail
where site_name = '{self.site_name}'
and date_type = 'month'
and date_info in ({CommonUtil.list_to_insql(last_11_month)})
......
......@@ -60,25 +60,51 @@ class DwtSTBaseReport(object):
df_rank_sv.show(10, False)
# 搜索词主表
# ===== 原逻辑(保留备查):从 dwt_aba_st_analytics 取词集合(st_key + search_term) =====
# 问题:dwt_aba_st_analytics = 爬虫 ∩ ABA,某月爬虫漏抓 → 该词该月不在 → 下面与排名 inner join 后,
# 趋势图那一月断格(排名很好的词突然缺一点)。
# sql2 = f"""
# select
# id as st_key,
# search_term
# from dwt_aba_st_analytics
# where site_name = '{self.site_name}'
# and date_type = '{self.date_type}'
# and date_info = '{self.date_info}';
# """
# 【改】st_key 改从 ods_st_key 取(全站"词→key"映射,与 dwt_st_sv_last365 / backfill 同款);
# 词集合不再被 dwt 卡,改由下面 dim_st_detail 的排名表(sql3)驱动 → inner join 后 = 当月 ABA 有 key 的词。
sql2 = f"""
select
id as st_key,
st_key,
search_term
from dwt_aba_st_analytics
where site_name = '{self.site_name}'
and date_type = '{self.date_type}'
and date_info = '{self.date_info}';
from ods_st_key
where site_name = '{self.site_name}';
"""
df_st_base = self.spark.sql(sql2).repartition(40, 'search_term').cache()
print("搜索词主表:")
df_st_base.show(10, False)
# 读ods_brand_analytics表,获取报告中的搜索词+排名
# 读ABA搜索词+排名(口径统一到 dim_st_detail,词集合由它驱动)
# ===== 原逻辑(保留备查):从 ods_brand_analytics 取 search_term + rank =====
# 原本词集合被上面 dwt(sql2) 卡住,这里的 ods rank 只作补值;为口径统一、且 ods 月分区可能一词多行,
# 改从 dim_st_detail 取(排名同源:dim.st_rank ← ods.rank,且已按词去重、一词一月一行)。
# sql3 = f"""
# select
# search_term,
# rank as st_rank
# from ods_brand_analytics
# where site_name = '{self.site_name}'
# and date_type = '{self.date_type}'
# and date_info = '{self.date_info}';
# """
# 【改】改读 dim_st_detail(ABA 清洗表,st_rank 即排名):由它驱动词集合 →
# 当月 ABA 有的词趋势图都有排名点,漏抓月不再断格;与月表/年表口径统一到 dim_st_detail。
sql3 = f"""
select
search_term,
rank as st_rank
from ods_brand_analytics
st_rank as st_rank
from dim_st_detail
where site_name = '{self.site_name}'
and date_type = '{self.date_type}'
and date_info = '{self.date_info}';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment