Commit 4059de4b by chenyuanjie

月asin利润率计算窗口调整

parent 8c22e819
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
author: CT author: CT
description: 导出待计算利润率的 ASIN(修复漏洞: 不再仅依赖 keepa 近 1 天更新) description: 导出待计算利润率的 ASIN(修复漏洞: 不再仅依赖 keepa 近 1 天更新)
【数据流】 【数据流】
flow_asin 池: Hive dwt_flow_asin 最近 3 月 ∪ Doris dwt.{site}_flow_asin_30day flow_asin 池: Hive dwt_flow_asin 最近 1 月 ∪ Doris selection.{site}_flow_asin_30day
→ (asin, price) 去重保留 asin_crawl_date 最新 → (asin, price) 去重保留 asin_crawl_date 最新
两路合并: 两路合并:
A) keepa 变动重算: flow_asin INNER JOIN keepa(updated_time >= date_info-1天) A) keepa 变动重算: flow_asin INNER JOIN keepa(updated_time >= date_info-1天)
...@@ -10,9 +10,8 @@ description: 导出待计算利润率的 ASIN(修复漏洞: 不再仅依赖 keep ...@@ -10,9 +10,8 @@ description: 导出待计算利润率的 ASIN(修复漏洞: 不再仅依赖 keep
INNER JOIN keepa(全量,无时间过滤) INNER JOIN keepa(全量,无时间过滤)
A ∪ B → 按 (asin, price) 去重保留 asin_crawl_date 最新 A ∪ B → 按 (asin, price) 去重保留 asin_crawl_date 最新
→ LEFT JOIN 分类 → 派生 source_month / part_key → 写 PG {site}_asin_profit_rate_calc → LEFT JOIN 分类 → 派生 source_month / part_key → 写 PG {site}_asin_profit_rate_calc
【近 3 月窗口】 【近 1 月窗口】
通过 MySQL workflow_everyday.MAX(report_date) WHERE date_type='month' AND page='流量选品' 取 MySQL workflow_everyday.MAX(report_date) WHERE date_type='month' AND page='流量选品' 对应月份
向前推 3 个月(参考 export_keepa_asin_del.py)
【已计算判断】 【已计算判断】
hive dim_asin_profit_rate_info 全量(只保留最新分区,按 site_name 过滤即可), hive dim_asin_profit_rate_info 全量(只保留最新分区,按 site_name 过滤即可),
按 (asin, price) LEFT ANTI 剔除 按 (asin, price) LEFT ANTI 剔除
...@@ -23,7 +22,6 @@ description: 导出待计算利润率的 ASIN(修复漏洞: 不再仅依赖 keep ...@@ -23,7 +22,6 @@ description: 导出待计算利润率的 ASIN(修复漏洞: 不再仅依赖 keep
import os import os
import sys import sys
from datetime import datetime, timedelta from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
sys.path.append(os.path.dirname(sys.path[0])) sys.path.append(os.path.dirname(sys.path[0]))
...@@ -49,10 +47,10 @@ class ExportNeedProfitRate(object): ...@@ -49,10 +47,10 @@ class ExportNeedProfitRate(object):
df_export = self.build_export_df() df_export = self.build_export_df()
self.write_to_pg(df_export) self.write_to_pg(df_export)
# ---------------- 公共数据池: flow_asin 近 3 月 ---------------- # ---------------- 公共数据池: flow_asin 近 1 月 ----------------
def _get_recent_3_months(self): def _get_recent_month(self):
"""通过 MySQL workflow_everyday 拿最大 report_date 向前推 3 月(参考 export_keepa_asin_del.py)""" """通过 MySQL workflow_everyday 拿最大 report_date 对应月份"""
sql_max_month = ( sql_max_month = (
f"select MAX(report_date) as date_info from workflow_everyday " f"select MAX(report_date) as date_info from workflow_everyday "
f"where site_name = '{self.site_name}' and date_type = 'month' and page = '流量选品'" f"where site_name = '{self.site_name}' and date_type = 'month' and page = '流量选品'"
...@@ -64,18 +62,16 @@ class ExportNeedProfitRate(object): ...@@ -64,18 +62,16 @@ class ExportNeedProfitRate(object):
pwd=mysql_con['pwd'], username=mysql_con['username'], query=sql_max_month, pwd=mysql_con['pwd'], username=mysql_con['username'], query=sql_max_month,
).collect()[0]['date_info'] ).collect()[0]['date_info']
print(f"workflow_everyday 最大 report_date: {max_date_info}") print(f"workflow_everyday 最大 report_date: {max_date_info}")
base_dt = datetime.strptime(str(max_date_info), '%Y-%m') recent_month = str(max_date_info)
months_3 = [(base_dt - relativedelta(months=i)).strftime('%Y-%m') for i in range(3)] print(f"近 1 月窗口: {recent_month}")
print(f"近 3 月窗口: {months_3}") return recent_month
return months_3
def _build_flow_asin_pool(self): def _build_flow_asin_pool(self):
"""flow_asin 池: Hive dwt_flow_asin 近 3 月 ∪ Doris {site}_flow_asin_30day """flow_asin 池: Hive dwt_flow_asin 近 1 月 ∪ Doris selection.{site}_flow_asin_30day
→ (asin, price) 去重保留 asin_crawl_date 最新""" → (asin, price) 去重保留 asin_crawl_date 最新"""
months_3 = self._get_recent_3_months() recent_month = self._get_recent_month()
months_in = ",".join([f"'{m}'" for m in months_3])
# 1. Hive dwt_flow_asin 近 3 # 1. Hive dwt_flow_asin 近 1
sql_dwt = f""" sql_dwt = f"""
SELECT asin, SELECT asin,
asin_price AS price, asin_price AS price,
...@@ -84,7 +80,7 @@ class ExportNeedProfitRate(object): ...@@ -84,7 +80,7 @@ class ExportNeedProfitRate(object):
FROM dwt_flow_asin FROM dwt_flow_asin
WHERE site_name = '{self.site_name}' WHERE site_name = '{self.site_name}'
AND date_type = 'month' AND date_type = 'month'
AND date_info IN ({months_in}) AND date_info = '{recent_month}'
AND asin_price > 0 AND asin_price > 0
""" """
print(f"sql_dwt =\n{sql_dwt}") print(f"sql_dwt =\n{sql_dwt}")
...@@ -92,8 +88,8 @@ class ExportNeedProfitRate(object): ...@@ -92,8 +88,8 @@ class ExportNeedProfitRate(object):
.withColumn('price', F.round(F.col('price'), 2).cast('decimal(20,2)')) \ .withColumn('price', F.round(F.col('price'), 2).cast('decimal(20,2)')) \
.withColumn('asin_crawl_date', F.to_timestamp(F.col('asin_crawl_date'))) .withColumn('asin_crawl_date', F.to_timestamp(F.col('asin_crawl_date')))
# 2. Doris dwt.{site}_flow_asin_30day(保留: 月数据可能延迟,30day 兜底) # 2. Doris selection.{site}_flow_asin_30day(保留: 月数据可能延迟,30day 兜底)
table_identifier = f"dwt.{self.site_name}_flow_asin_30day" table_identifier = f"selection.{self.site_name}_flow_asin_30day"
read_fields = "asin,price,category_first_id,asin_crawl_date" read_fields = "asin,price,category_first_id,asin_crawl_date"
df_doris = DorisHelper.spark_import_with_connector(self.spark, table_identifier, read_fields) \ df_doris = DorisHelper.spark_import_with_connector(self.spark, table_identifier, read_fields) \
.filter(F.col('price') > 0) \ .filter(F.col('price') > 0) \
......
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