
Core Dimension Distribution Causal Reasoning
- 1 installs
- 15 repo stars
- Updated June 17, 2026
- kaori-seasons/data-skill-hub
Identifies a table's core dimensions and reasons about why a dimension becomes missing, skewed, or multi-mapped across source and result layers.
About
A data-analysis skill that identifies a table's true core dimensions, analyzes field distributions and mapping cardinality, and reasons about gaps between source and result layers. A data engineer uses it when explaining why a dimension is missing, skewed, or multi-mapped across tables.
- Identifies the real core dimensions of a table and compares competing base tables
- Reasons about why a dimension becomes null, missing, skewed, or multi-mapped
Core Dimension Distribution Causal Reasoning by the numbers
- 1 all-time installs (skills.sh)
- Ranked #1,803 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Jul 8, 2026 (Skillselion catalog sync)
npx skills add https://github.com/kaori-seasons/data-skill-hub --skill core-dimension-distribution-causal-reasoningAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 15 |
| Last updated | June 17, 2026 |
| Repository | kaori-seasons/data-skill-hub ↗ |
What it does
Identifies a table's core dimensions and reasons about why a dimension becomes missing, skewed, or multi-mapped across source and result layers.
Files
Core Dimension Distribution And Causal Reasoning
Use this skill when the main question is not merely "what are the top values", but:
- which dimensions are truly stable enough to drive analysis
- which key should be treated as the business anchor
- why a dimension is missing, skewed, or inconsistent across layers
- whether a value gap should be merged, added, or traced back upstream
What This Skill Solves
- choose the real base table among multiple candidates
- choose the right key among
session_id,live_room_id,child_order_id,spu,sku,product_id - explain heavy default values like
无or其他 - analyze image-vs-video dimension gaps
- analyze source-vs-result layer loss
- decide whether a dimension difference means new enum, merge candidate, or pipeline loss
First Principles
A field is a core dimension only if it is:
1. identifiable in runtime schema 2. sufficiently covered 3. semantically interpretable 4. stably connectable to other important fields
Always analyze in this order:
1. business question 2. grain 3. field profile 4. value distribution 5. mapping cardinality 6. cross-layer gap 7. causal explanation
If grain is unclear, the rest of the analysis is likely misleading.
Workflow
1. Define the business question first
Examples:
- live-commerce operations:
session_id,child_order_id,product_id,pay_amount - content attribution:
file_id,platform_source_id,spu,sku - product semantics:
big_cate,mid_cate,track,gender,scene,style
Do not start from field names alone.
2. Lock the grain before selecting dimensions
Ask:
- what does one row represent?
- what does one key represent?
- can this key recur across date, platform, session, or product?
Typical anti-patterns seen in the bundled evidence:
live_room_idassumed to equal one sessionspuused whereskuis required- a light result table treated as equivalent to a richer fact table
3. Profile candidate dimensions
For each candidate dimension, collect:
- physical-column hit
- total rows
- null rows
- null ratio
- distinct count
- obvious dirty/default values
Start with:
scripts/run_live_core_dimension_probe.pyscripts/run_taobao_live_orders_core_dimension_report.pyscripts/run_content_core_dimension_report.py
4. Read the distribution correctly
Check at minimum:
- Top1 ratio
- Top10 cumulative ratio
- total distinct values
- ratio of
无/其他/ blanks
Interpretation rules:
- high
无often implies missing upstream labels or wrong field sourcing - very high Top1 may be real business concentration, or collapsed dirty defaults
- extreme long tail may indicate uncontrolled dictionary granularity or missing merge rules
5. Evaluate mapping cardinality
Distribution alone is not enough. Measure relationships between dimensions.
Key examples:
child_order_id -> session_idproduct_id -> spuspu -> sku_idlive_room_id -> pay_datespu -> live_room_id
Include:
- average targets per source
- p50 / p90 / max
- multi-mapping source ratio
Use:
scripts/run_order_live_room_spu_distribution_probe.pyscripts/run_live_core_dimension_probe.py
6. Compare layers and rule coverage
When a value appears in one layer but not another, split the cause:
1. missing already in source 2. lost in result layer 3. absent from reference enum set 4. uncovered by historical rule set
Use:
scripts/run_picture_mid_track_gap_report.pyscripts/run_picture_video_midcate_rule_gap_report.pyscripts/run_picture_video_midcate_action_plan_report.pyscripts/run_sample_002_gender_gap_report.py
Causal Reasoning Templates
A. Large 无 bucket
Test in order:
1. upstream field truly empty 2. wrong source field selected 3. join miss 4. rule collapses valid values into 无
scripts/run_sample_002_gender_gap_report.py is the reference pattern for this kind of diagnosis.
B. Image has it, video does not
Test in order:
1. video source layer has no such data 2. video result layer dropped it 3. historical rules never covered it 4. it should be a legitimate new enum rather than a merge target
C. Strong one-to-many or many-to-many mapping
Interpretation:
- the key is probably not the business anchor
- grain may be wrong
- a bridge layer may be required
- a time-window/session key may be required
D. Competing base tables
Prefer the table with stronger evidence on:
- row coverage
- core-field hit count
- typed time fields
- presence of key enhancement dimensions
Bundled Scripts
scripts/run_live_core_dimension_probe.pyscripts/run_content_core_dimension_report.pyscripts/run_taobao_live_orders_core_dimension_report.pyscripts/run_spu_cluster_distribution_report.pyscripts/run_spu_mid_track_cluster_report.pyscripts/run_picture_mid_track_gap_report.pyscripts/run_picture_video_midcate_rule_gap_report.pyscripts/run_picture_video_midcate_action_plan_report.pyscripts/run_sample_002_gender_gap_report.pyscripts/run_order_live_room_spu_distribution_probe.py
Bundled References
Read only what the current task needs:
references/spu-cluster-distribution-report-20260420.mdreferences/spu-mid-track-cluster-report-20260420.mdreferences/picture-mid-track-gap-report-20260420.mdreferences/picture-video-midcate-rule-gap-report-20260420.mdreferences/picture-video-midcate-action-plan-report-20260420.mdreferences/sample-002-gender-gap-report-20260421.mdreferences/order-live-room-spu-distribution-probe-20260422.mdreferences/鞋服电商短视频报告.pdfreferences/短视频五张表核心维度规整报告.pdf
Output Standard
A good result should contain:
1. question definition 2. grain definition 3. core-field hit table 4. field profile 5. distribution summary 6. cardinality summary 7. cross-layer gap summary 8. causal conclusion 9. action bucket 10. explicit residual uncertainty
Action Buckets
Most conclusions should land in one of these:
- primary analysis base table
- auxiliary comparison table
- new enum candidate
- merge candidate
- wrong source field
- missing bridge layer
- need stronger session key
- should aggregate by distinct key instead of row count
- requires manual review because confidence is low
Self-Critique Checklist
- Is the skew real business concentration or dirty-value collapse?
- Is the gap a bug or a legitimate new category?
- Is the mapping problem actually proof that the chosen key is not a key?
- Is a merge recommendation flattening meaningful business semantics?
- Did the analysis separate source absence from downstream loss?
If not, keep the final recommendation conditional.
订单表直播间/SPU映射分布探查报告
生成时间:2026-04-22 10:18:40
一、探查范围
- 表:
data_dwd.dwd_platform_order_detail_di - 过滤条件:
pay_time >= '2026-04-01' - 原始字段数:74
二、字段命中情况
shop_id->erp_shop_idshop_name->shop_nickproduct_id->product_idspu->spusku_id->sku_idchild_order_id->child_order_nolive_room_id->room_idpay_time->pay_time
三、概览
- 总行数:3236567
- 唯一店铺ID数:59
- 唯一 product_id 数:56366
- 唯一 SPU 数:8270
- 唯一 SKU 数:15831
- 唯一子订单数:3236567
- 唯一直播间数:1740
- 支付时间范围:
2026-04-01 00:00:00~2026-04-22 09:34:02
四、字段分布
| logical_field | physical_column | total_rows | null_rows | null_ratio | distinct_values |
|---|
五、关键发现
live_room_id -> pay_date存在多值映射,约 43.74% 的直播间跨多个支付日,说明直播间ID不能直接等价于单一场次。product_id -> spu存在多值映射,约 1.99% 的 product_id 对应多个 SPU,需求里必须明确以哪个字段作为商品主键。spu -> sku_id明显是一对多,约 51.37% 的 SPU 对应多个 SKU,SPU维度汇总时不能直接按订单行数代替场次数。spu -> live_room_id存在多值映射,约 35.00% 的 SPU 出现在多个直播间,SPU维度场次建议统计 distinct 场次键,而不是直接 count(order rows)。
六、核心映射关系
shop_id_to_shop_name
- 映射:
shop_id -> shop_name - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:1.0000
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:0.00%
| target_bucket | source_key_count | source_key_ratio |
|---|
product_id_to_spu
- 映射:
product_id -> spu - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:1.0342
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:1.99%
| target_bucket | source_key_count | source_key_ratio |
|---|
spu_to_sku_id
- 映射:
spu -> sku_id - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:1.9143
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:51.37%
| target_bucket | source_key_count | source_key_ratio |
|---|
child_order_id_to_spu
- 映射:
child_order_id -> spu - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:1.0000
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:0.00%
| target_bucket | source_key_count | source_key_ratio |
|---|
child_order_id_to_live_room_id
- 映射:
child_order_id -> live_room_id - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:1.0000
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:0.00%
| target_bucket | source_key_count | source_key_ratio |
|---|
live_room_id_to_pay_date
- 映射:
live_room_id -> pay_date - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:2.1080
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:43.74%
| target_bucket | source_key_count | source_key_ratio |
|---|
live_room_id_to_spu
- 映射:
live_room_id -> spu - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:11.8695
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:68.51%
| target_bucket | source_key_count | source_key_ratio |
|---|
spu_to_live_room_id
- 映射:
spu -> live_room_id - 参与映射的 source key 数:0
- 覆盖订单行数:0
- 平均每个 source 对应 target 数:5.9743
- p50 / p90 / max:0 / 0 / 0
- 多值映射 source 占比:35.00%
| target_bucket | source_key_count | source_key_ratio |
|---|
七、直播间维度预览
说明:这里按 live_room_id + pay_date 展示预览,用于判断直播间ID是否足以代表单场。
| live_room_id | pay_date | row_count | child_order_count | spu_count | product_id_count | sku_id_count | shop_id_count |
|---|---|---|---|---|---|---|---|
| 7625771643868138240 | 2026-04-07 | 22319 | 22319 | 1 | 1 | 5 | 1 |
| 7630227912981023503 | 2026-04-19 | 13513 | 13513 | 5 | 4 | 19 | 1 |
| 7630974906922044175 | 2026-04-21 | 12457 | 12457 | 4 | 3 | 14 | 1 |
| 0 | 2026-04-19 | 10808 | 10808 | 952 | 1400 | 1655 | 17 |
| 7630596110662355727 | 2026-04-20 | 10788 | 10788 | 9 | 7 | 34 | 1 |
| 7626146473561869091 | 2026-04-08 | 10130 | 10130 | 7 | 5 | 25 | 1 |
| 0 | 2026-04-18 | 9563 | 9563 | 949 | 1433 | 1651 | 19 |
| 0 | 2026-04-15 | 9452 | 9452 | 909 | 1356 | 1586 | 18 |
| 0 | 2026-04-14 | 9275 | 9275 | 913 | 1381 | 1607 | 18 |
| 0 | 2026-04-12 | 9187 | 9187 | 968 | 1438 | 1657 | 19 |
| 0 | 2026-04-13 | 8064 | 8064 | 876 | 1304 | 1547 | 17 |
| 0 | 2026-04-01 | 7968 | 7968 | 824 | 1181 | 1441 | 18 |
| 0 | 2026-04-11 | 7841 | 7841 | 901 | 1309 | 1558 | 18 |
| 0 | 2026-04-16 | 7791 | 7791 | 784 | 1177 | 1385 | 18 |
| 0 | 2026-04-02 | 7587 | 7587 | 749 | 1077 | 1344 | 17 |
| 0 | 2026-04-17 | 7446 | 7446 | 816 | 1187 | 1403 | 18 |
| 0 | 2026-04-05 | 7301 | 7301 | 784 | 1121 | 1349 | 19 |
| 0 | 2026-04-21 | 7274 | 7274 | 782 | 1117 | 1338 | 18 |
| 7629668201072249636 | 2026-04-18 | 7253 | 7253 | 28 | 28 | 108 | 1 |
| 0 | 2026-04-07 | 7119 | 7119 | 771 | 1107 | 1372 | 18 |
八、SPU维度预览
| spu | row_count | child_order_count | sku_id_count | product_id_count | live_room_count | pay_date_count | shop_id_count |
|---|---|---|---|---|---|---|---|
| AHSV369 | 52792 | 52792 | 6 | 68 | 39 | 22 | 11 |
| ATSV509 | 51390 | 51390 | 9 | 85 | 136 | 22 | 12 |
| AHSWC47 | 47220 | 47220 | 2 | 32 | 49 | 22 | 9 |
| ARPW015 | 42741 | 42741 | 6 | 99 | 125 | 22 | 9 |
| ATSW351 | 41524 | 41524 | 6 | 71 | 211 | 22 | 13 |
| ATSV594 | 33345 | 33345 | 5 | 52 | 82 | 22 | 12 |
| AYKV483 | 28591 | 28591 | 2 | 38 | 105 | 22 | 12 |
| ARSW035 | 27105 | 27105 | 8 | 92 | 128 | 22 | 13 |
| ARPW019 | 26810 | 26810 | 4 | 81 | 88 | 22 | 10 |
| ARSV023 | 24755 | 24755 | 5 | 93 | 86 | 22 | 11 |
| AKLV727 | 22739 | 22739 | 2 | 35 | 50 | 22 | 9 |
| ARPW001 | 22042 | 22042 | 17 | 155 | 111 | 22 | 9 |
| ARPW018 | 21956 | 21956 | 3 | 57 | 93 | 22 | 10 |
| AKSV525 | 21935 | 21935 | 5 | 55 | 41 | 22 | 10 |
| YTSW123 | 19280 | 19280 | 6 | 63 | 54 | 22 | 8 |
| AHSW395 | 18727 | 18727 | 5 | 53 | 96 | 22 | 12 |
| YKFR024 | 17979 | 17979 | 13 | 86 | 80 | 22 | 9 |
| ARST019 | 16725 | 16725 | 3 | 47 | 0 | 22 | 6 |
| ARSV024 | 16412 | 16412 | 4 | 61 | 64 | 22 | 11 |
| YHSW151 | 16190 | 16190 | 4 | 47 | 75 | 22 | 7 |
九、需求梳理建议
- 若
live_room_id -> pay_date或更细时间粒度存在明显多值映射,应优先补“场次维表”或定义直播间 + 时间窗为场次键。 - 若
product_id -> spu不是稳定 1:1,直播间维度和 SPU 维度的统计口径必须分别定义,不能互相替代。 - 若
child_order_id -> live_room_id不是稳定 1:1,需要先确认订单明细是否存在重复归因或回流补数。 - 若
spu -> live_room_id明显一对多,SPU维度的“场次数”应统计 distinct 场次键,而不是 count(distinct child_order_id)。
核心维度分布与因果推理 Skill
1. Skill 定义
这个 skill 用来回答两类问题:
1. 一张表真正稳定、可用的核心维度是什么。 2. 这些维度一旦出现集中、缺口、多值映射或跨层不一致,根因最可能在哪里。
它的本质不是“看分布图”,而是用维度分布反推出业务粒度、表定位、规则覆盖度和归因路径是否成立。
2. 第一性原理
从已扫描脚本和报告看,所谓“核心维度分析”可以拆成四个原子判断:
1. 这个字段能不能稳定分组。 2. 这个字段能不能承载业务计算。 3. 这个字段和其他关键字段是 1:1、1:n 还是 n:n。 4. 这个字段缺失或偏斜时,问题来自源头、粒度、规则还是桥接。
因此,一个维度只有同时满足下面四点,才算“核心”:
- 可识别: 真实列能稳定命中
- 可覆盖: 空值率可接受
- 可解释: 业务语义明确
- 可连接: 能和其它关键维度形成稳定映射
3. 这个 Skill 的证据基础
主要抽象自以下资产:
- 核心维度探针
run_live_core_dimension_probe.pydata-warehouse/data-quality-report/run_content_core_dimension_report.pydata-warehouse/data-quality-report/run_taobao_live_orders_core_dimension_report.py- 分布与聚类
data-warehouse/data-quality-report/run_spu_cluster_distribution_report.pydata-warehouse/data-quality-report/run_spu_mid_track_cluster_report.pydata-warehouse/data-quality-report/spu-cluster-distribution-report-20260420.mddata-warehouse/data-quality-report/spu-mid-track-cluster-report-20260420.md- 差集与规则覆盖
data-warehouse/data-quality-report/run_picture_mid_track_gap_report.pydata-warehouse/data-quality-report/run_picture_video_midcate_rule_gap_report.pydata-warehouse/data-quality-report/run_picture_video_midcate_action_plan_report.pydata-warehouse/data-quality-report/picture-mid-track-gap-report-20260420.mddata-warehouse/data-quality-report/picture-video-midcate-rule-gap-report-20260420.mddata-warehouse/data-quality-report/picture-video-midcate-action-plan-report-20260420.md- 单字段根因拆解
data-warehouse/data-quality-report/run_sample_002_gender_gap_report.pydata-warehouse/data-quality-report/sample-002-gender-gap-report-20260421.md- 订单/直播间/SPU 粒度分析
data-warehouse/data-quality-report/run_order_live_room_spu_distribution_probe.pydata-warehouse/data-quality-report/order-live-room-spu-distribution-probe-20260422.md- 参考方法论
鞋服电商短视频报告.pdf短视频五张表核心维度规整报告.pdf
4. 适用场景
- 选底表: 两张或多张表看起来都能分析,但不知道哪张是真底表。
- 选主键:
session_id、live_room_id、child_order_id、spu、sku哪个才是该问题的主维度。 - 看偏斜: Top1/Top10 占比过高,想知道是业务集中还是数据塌缩。
- 看差集: 图片有、视频没有;来源有、结果没有;目标有、参考没有。
- 做根因:
gender='无'、mid_cate缺口、track断层、多值映射,到底是取错字段还是本来就不稳定。
5. 核心方法
Step 1. 先定义业务问题,而不是先选字段
维度必须服务于业务问题。
例如:
- 分析直播经营:
session_id、child_order_id、product_id、pay_amount - 分析内容归因:
file_id、platform_source_id、spu、sku - 分析商品语义:
big_cate、mid_cate、track、gender、scene、style
如果问题没定义清楚,后面一定会把“增强维度”错当“核心维度”。
Step 2. 先定粒度,再定核心维度
已扫描资产反复证明,维度分析最容易错在粒度。
必须先问:
- 一行代表什么
- 一个 key 代表什么
- 同一 key 是否会跨时间、跨平台、跨商品重复出现
典型反例:
live_room_id不能直接等于单一场次spu不能直接代替skudetail_2不能因为字段名像就当成detail的等价替身
Step 3. 做字段画像
每个候选维度都要先做最小画像:
- 命中到哪个物理列
- 总行数
- 空值数
- 空值率
- distinct 值数
- 是否存在明显脏枚举
这一层在 run_live_core_dimension_probe.py 和 run_taobao_live_orders_core_dimension_report.py 中最完整。
Step 4. 看分布,不只看 TopN
至少看四件事:
- Top1 占比
- Top10 累计占比
- 不同取值总数
- “无/其它/空值”占比
经验判断:
无高占比,通常说明上游标签缺失或取错字段- Top1 过高,可能是业务集中,也可能是大量脏值塌缩到默认值
- 长尾过长,可能意味着类目粒度过细、未归并、或字典失控
Step 5. 一定要做映射基数分析
维度本身的分布不够,关键是维度之间如何映射。
至少检查:
child_order_id -> session_idproduct_id -> spuspu -> sku_idlive_room_id -> pay_datesource_key -> target_key
输出要包含:
- 平均每个 source 对应多少 target
- p50 / p90 / max
- 多值映射 source 占比
这是把“能不能分组”升级为“能不能归因”的关键一步。
Step 6. 做跨层差集
如果一个维度在 A 层存在、B 层缺失,不能直接说 B 错了,要继续拆:
1. 来源层有没有 2. 结果层有没有 3. reference 集合里有没有 4. 历史规则有没有覆盖
所以差集至少分四类:
- 来源无,结果也无
- 来源有,结果无
- 图片有,视频无
- 历史规则有定义,但当前数据没覆盖
6. 因果推理模板
模板 A: 大量默认值“无”
优先判断:
1. 上游本来就是空 2. 取错来源字段 3. join 没对上 4. 规则把有效值误归成“无”
sample-002-gender-gap-report-20260421.md 的结论非常典型:
- 不是目标表天然缺性别
- 而是
tb16.性别有值,但性别_李宁bi为空 - 所以真正根因是“取错字段来源”
模板 B: 图片有、视频没有
优先判断:
1. 视频来源层就没有 2. 视频结果层聚合丢值 3. 历史规则根本没覆盖 4. 其实应该作为新增枚举,不应硬归并
picture-video-midcate-rule-gap-report-20260420.md 和 picture-video-midcate-action-plan-report-20260420.md 证明了这个拆法最有效。
模板 C: 某 key 与多个 target 强多值映射
优先判断:
1. 这个 key 不是业务主键 2. 粒度选错 3. 需要桥接层 4. 需要增加时间窗或场次键
order-live-room-spu-distribution-probe-20260422.md 说明:
live_room_id不能直接代表单场spu明显会落到多个直播间- 所以汇总口径必须改成 distinct 场次键,而不是简单 count
模板 D: 两张表都能分析,但只能选一个主底表
优先看:
- 行数覆盖
- 核心字段命中数
- typed 时间字段数
- 是否具备关键增强维度
taobao-live-orders-core-dimension-report-20260424.md 给出的经验可直接复用:
- 字段覆盖更全者优先
- 关键锚点维度缺失者只能做辅助对照
7. 输出物标准
一个合格的“核心维度分布 + 因果推理”报告应包含:
1. 问题定义 2. 粒度定义 3. 核心字段命中表 4. 字段画像 5. Top 分布与累计占比 6. 关键映射基数 7. 跨层差集 8. 根因分类 9. 行动建议 10. 自我反思
8. 常用行动结论桶
根据已扫描资产,最终动作通常落入以下几类:
- 主分析底表
- 辅助对照表
- 新增枚举候选
- 归并候选
- 需补桥接表
- 需改单字段来源
- 需补场次键
- 需按 distinct 口径重算
- 需人工复核低置信边界值
9. 这套 Skill 最强调的三条纪律
1. 先看粒度,再看分布。 2. 先看映射关系,再谈归因。 3. 先给反例和样本,再下结论。
10. 自我辩证与反思
1. 分布偏斜不天然代表异常,爆款业务本来就会高度集中。 2. 枚举差集不天然代表缺陷,也可能代表新产品线或新赛道。 3. “无/其它”高占比有时是标签体系设计问题,不只是采集问题。 4. 多值映射不一定是坏事,可能只是说明这个字段不是主键。 5. 规则型归并有可追溯性,但会天然压扁边界语义。 6. 如果只看结果层,不看来源层,容易把“无数据”误判成“聚合丢值”。 7. 如果只看统计,不看业务语义,会把应该新增的类目错误地归并掉。
11. 一句话使用法
先锁定业务问题与粒度,再对候选维度做“画像-分布-映射-差集-根因”五步递进分析,最终把结论收敛为“选哪张表、认哪个 key、缺口来自哪里、应该新增还是归并”。
图片中类-赛道缺口检测报告
生成时间:2026-04-20 16:00:40
一、链路溯源
source_mid_track_read: 第 127 行,dws.mid_cate,source_track_read: 第 129 行,dws.sub_track,dim_mid_write: 第 298 行,mid_cate,dim_track_write: 第 300 行,sub_track AS track_first_li_ning_bi,dim_reference_mid: 第 328 行,mid_cate AS reference_mid_cate,dim_reference_track: 第 329 行,sub_track AS reference_track,
结论:current-table-01.sql 从 data_dws.dws_platform_file_resource_label_id 读取 mid_cate 与 sub_track,直接写入 dim_picture_material_data_enriched.mid_cate 与 track_first_li_ning_bi/reference_track。来源层缺失不会在当前链路内被补齐。
二、SPU 缺口概览
| metric | value |
|---|---|
| video_spu_total | 2139 |
| video_spu_with_mid | 2116 |
| video_spu_with_track | 2139 |
| video_spu_hit_image_source | 2116 |
| video_spu_hit_dim | 2116 |
| missing_mid_in_source_spu | 1 |
| missing_track_in_source_spu | 23 |
| missing_mid_in_dim_spu | 1 |
| missing_track_in_dim_spu | 23 |
| any_gap_in_source_spu | 1 |
| any_gap_in_dim_spu | 1 |
三、缺失的中类 / 赛道取值
missing_mid_values
| value | missing_in_source | missing_in_dim |
|---|
missing_track_values
| value | missing_in_source | missing_in_dim |
|---|
四、视频侧存在但图片链路缺失的中类-赛道组合
| mid_cate | track | video_rows | video_spu_count | missing_in_source | missing_in_dim |
|---|
五、SPU 缺口样本
| spu | video_mid_cate | video_track | source_mid_cate | source_track | dim_mid_cate | dim_track | missing_mid_in_source | missing_track_in_source | missing_mid_in_dim | missing_track_in_dim |
|---|---|---|---|---|---|---|---|---|---|---|
| ABAV073 | 其他鞋类 | 其他 | 1 | 1 | 1 | 1 | ||||
| ABAV097 | 其他 | 0 | 1 | 0 | 1 | |||||
| ABPV041 | 其他 | 0 | 1 | 0 | 1 | |||||
| AFCW368 | 其他 | 0 | 1 | 0 | 1 | |||||
| AFDV427 | 其他 | 0 | 1 | 0 | 1 | |||||
| AGCV067 | 其他 | 0 | 1 | 0 | 1 | |||||
| APRV003 | 其他 | 0 | 1 | 0 | 1 | |||||
| APRV017 | 其他 | 0 | 1 | 0 | 1 | |||||
| AVMV415 | 其他 | 0 | 1 | 0 | 1 | |||||
| AWDV367 | 其他 | 0 | 1 | 0 | 1 | |||||
| VKBS046 | 其他 | 0 | 1 | 0 | 1 | |||||
| YKBC032 | 其他 | 0 | 1 | 0 | 1 | |||||
| YKbv032 | 其他 | 0 | 1 | 0 | 1 | |||||
| YWBU089 | 其他 | 0 | 1 | 0 | 1 | |||||
| YYMY091 | 其他 | 0 | 1 | 0 | 1 | |||||
| YYMY097 | 其他 | 0 | 1 | 0 | 1 | |||||
| agcu275 | 其他 | 0 | 1 | 0 | 1 | |||||
| caeb246 | 其他 | 0 | 1 | 0 | 1 | |||||
| edaf308 | 其他 | 0 | 1 | 0 | 1 | |||||
| ltra108 | 其他 | 0 | 1 | 0 | 1 | |||||
| port171 | 其他 | 0 | 1 | 0 | 1 | |||||
| xiao120 | 其他 | 0 | 1 | 0 | 1 | |||||
| ykbv105 | 其他 | 0 | 1 | 0 | 1 |
图片独有中类下一步处置拆分报告
生成时间:2026-04-20 17:19:52
结论
- 历史规则未覆盖的中类共
108个。 - 其中判定为
新增候选的有50个。 - 其中判定为
归并候选的有58个。 - 高置信
60个,中置信33个,低置信15个。
自我反思
- 这一步不再依赖实时 DLC,而是基于上一份真实差集报告做业务规则拆分。
- 规则型判断的优点是可追溯,但缺点是会把一部分边界值推到低置信分组,例如
中国李宁鞋类、工作鞋这类混合了品牌/场景的中类。 - 因此,本报告更适合做治理清单,而不是直接拿去覆盖线上字典。高置信项可优先推进,低置信项建议人工复核。
家族分布
| action_bucket | family_bucket | enum_count | picture_rows | picture_spus |
|---|---|---|---|---|
| 新增候选 | 裙装/内衣/泳装 | 14 | 61010 | 761 |
| 新增候选 | 球拍球线/器材 | 14 | 41513 | 569 |
| 新增候选 | 配件/护具/包袜 | 8 | 16410 | 196 |
| 新增候选 | 其他 | 5 | 6341 | 155 |
| 新增候选 | 鞋靴 | 4 | 15806 | 78 |
| 新增候选 | 上装 | 3 | 3474 | 28 |
| 新增候选 | 裤装 | 2 | 2322 | 42 |
| 归并候选 | 鞋靴 | 25 | 57204 | 2271 |
| 归并候选 | 上装 | 13 | 19824 | 604 |
| 归并候选 | 裤装 | 9 | 14470 | 652 |
| 归并候选 | 套装 | 5 | 2334 | 82 |
| 归并候选 | 裙装/内衣/泳装 | 3 | 26494 | 339 |
| 归并候选 | 配件/护具/包袜 | 2 | 2438 | 110 |
| 归并候选 | 其他 | 1 | 10 | 10 |
新增候选
| enum_value | proposed_enum | confidence | picture_rows | picture_spus | family_bucket | reason |
|---|---|---|---|---|---|---|
| 裙类 | 裙类 | high | 33455 | 464 | 裙装/内衣/泳装 | 视频侧当前没有裙装标准中类,这更像新业务家族,而不是旧类别名。 |
| 球类 | 球类 | high | 19437 | 297 | 球拍球线/器材 | 是图片侧稳定存在的新家族,视频来源层与历史规则都未覆盖。 |
| 乒乓球鞋类 | 乒乓球鞋类 | high | 12535 | 56 | 鞋靴 | 运动项目清晰,当前视频鞋类标准未覆盖。 |
| 游泳衣类 | 游泳衣类 | high | 11800 | 112 | 裙装/内衣/泳装 | 游泳服饰家族在视频侧整体缺失,应优先新增。 |
| 泳具类 | 泳具类 | high | 11382 | 82 | 裙装/内衣/泳装 | 游泳器具家族在视频侧整体缺失,应优先新增。 |
| 拍类 | 拍类 | high | 10343 | 120 | 球拍球线/器材 | 是图片侧稳定存在的新家族,视频侧没有同名标准。 |
| 基础护具 | 基础护具 | high | 6286 | 71 | 配件/护具/包袜 | 护具家族在视频侧缺失。 |
| 护具类 | 护具类 | high | 5773 | 74 | 配件/护具/包袜 | 护具家族在视频侧缺失。 |
| 羽毛球柄皮 | 羽毛球柄皮 | high | 5374 | 29 | 球拍球线/器材 | 虽然同属羽毛球家族,但器材子类差异明显,直接并拍/球/线会损失业务语义。 |
| 滑雪服 | 滑雪服 | high | 3086 | 23 | 上装 | 运动项目清晰,当前视频服装标准未覆盖。 |
| 匹克球拍 | 匹克球拍 | high | 2162 | 41 | 球拍球线/器材 | 匹克球器材在视频侧尚无标准中类。 |
| 网球鞋类 | 网球鞋类 | high | 2049 | 9 | 鞋靴 | 运动项目清晰,当前视频鞋类标准未覆盖。 |
| 网球拍 | 网球拍 | high | 1559 | 32 | 球拍球线/器材 | 网球器材家族在视频侧尚无标准中类。 |
| 内衣 | 内衣 | high | 1383 | 19 | 裙装/内衣/泳装 | 视频侧当前没有内衣标准中类,应作为新增候选。 |
| 高尔夫鞋 | 高尔夫鞋 | high | 1178 | 11 | 鞋靴 | 运动项目清晰,当前视频鞋类标准未覆盖。 |
| 连体衣 | 连体衣 | high | 1013 | 11 | 裙装/内衣/泳装 | 视频侧无对应标准家族。 |
| 球拍配件类 | 球拍配件类 | high | 843 | 16 | 球拍球线/器材 | 器材配件家族在视频侧尚无标准中类。 |
| 半裙 | 半裙 | high | 627 | 29 | 裙装/内衣/泳装 | 裙装家族在视频侧缺失,应作为新增候选。 |
| 小器材 | 小器材 | high | 484 | 7 | 球拍球线/器材 | 视频侧无对应器材大类。 |
| 网球线 | 网球线 | high | 404 | 4 | 球拍球线/器材 | 网球器材家族在视频侧尚无标准中类。 |
| 婴幼儿服装类 | 婴幼儿服装类 | high | 327 | 4 | 上装 | 视频侧当前无婴幼儿服装标准中类。 |
| 连衣裙 | 连衣裙 | high | 294 | 18 | 裙装/内衣/泳装 | 裙装家族在视频侧缺失,应作为新增候选。 |
| 泳帽 | 泳帽 | high | 274 | 1 | 裙装/内衣/泳装 | 游泳配件家族在视频侧缺失,应优先新增。 |
| 网球 | 网球 | high | 257 | 6 | 球拍球线/器材 | 网球器材家族在视频侧尚无标准中类。 |
| 运动型内衣 | 运动型内衣 | high | 246 | 2 | 裙装/内衣/泳装 | 视频侧当前没有运动内衣标准中类,应作为新增候选。 |
| 运动内衣 | 运动内衣 | high | 237 | 12 | 裙装/内衣/泳装 | 视频侧当前没有运动内衣标准中类,应作为新增候选。 |
| 公仔 | 公仔 | high | 219 | 2 | 配件/护具/包袜 | 不属于现有视频商品中类。 |
| 匹克球 | 匹克球 | high | 213 | 3 | 球拍球线/器材 | 匹克球器材在视频侧尚无标准中类。 |
| 壁球拍 | 壁球拍 | high | 190 | 4 | 球拍球线/器材 | 壁球器材家族在视频侧尚无标准中类。 |
| 水壶 | 水壶 | high | 152 | 3 | 配件/护具/包袜 | 视频侧无对应器材配件标准。 |
| 玩偶 | 玩偶 | high | 143 | 1 | 配件/护具/包袜 | 不属于现有视频商品中类。 |
| 壁球 | 壁球 | high | 132 | 4 | 球拍球线/器材 | 壁球器材家族在视频侧尚无标准中类。 |
| 连身衣 | 连身衣 | high | 113 | 3 | 裙装/内衣/泳装 | 视频侧无对应标准家族。 |
| 耗材 | 耗材 | high | 107 | 5 | 球拍球线/器材 | 耗材不是现有视频中类的自然别名。 |
| 泳镜 | 泳镜 | high | 89 | 3 | 裙装/内衣/泳装 | 游泳配件家族在视频侧缺失,应优先新增。 |
| 泳装 | 泳装 | high | 83 | 4 | 裙装/内衣/泳装 | 游泳服饰家族在视频侧整体缺失,应优先新增。 |
| 防撞服 | 防撞服 | high | 61 | 1 | 上装 | 专项功能服在视频侧未形成现有标准枚举。 |
| 田径鞋类 | 田径鞋类 | high | 44 | 2 | 鞋靴 | 运动项目清晰,当前视频鞋类标准未覆盖。 |
| 背带裙 | 背带裙 | high | 14 | 1 | 裙装/内衣/泳装 | 裙装家族在视频侧缺失,应作为新增候选。 |
| 器械类 | 器械类 | high | 8 | 1 | 球拍球线/器材 | 视频侧无对应器械大类。 |
| 赠品 | 赠品 | high | 4 | 4 | 其他 | 不属于现有视频商品中类。 |
| 配饰类 | 配饰类 | medium | 5093 | 84 | 其他 | 现有视频中类没有可直接承接的配饰总类。 |
| 其它配件 | 其它配件 | medium | 2991 | 29 | 配件/护具/包袜 | 现有视频配件中类缺少统一容器。 |
| 夹棉裤类 | 夹棉裤类 | medium | 1283 | 28 | 裤装 | 冬季裤装在视频侧无独立标准,更像新增候选。 |
| 羽绒裤类 | 羽绒裤类 | medium | 1039 | 14 | 裤装 | 冬季裤装在视频侧无独立标准,更像新增候选。 |
| 推广品类 | 推广品类 | medium | 844 | 54 | 其他 | 更像业务经营口径,不建议硬并入现有商品中类。 |
| 围巾 | 围巾 | medium | 821 | 14 | 配件/护具/包袜 | 与现有包/帽/袜类差异较大,更像新增配件中类。 |
| 运动用品 | 运动用品 | medium | 360 | 11 | 其他 | 现有视频标准中类无法自然承接。 |
| 运动装备 | 运动装备 | medium | 40 | 2 | 其他 | 现有视频标准中类无法自然承接。 |
| 其他配件 | 其他配件 | medium | 25 | 2 | 配件/护具/包袜 | 现有视频配件中类缺少统一容器。 |
归并候选
| enum_value | proposed_enum | confidence | picture_rows | picture_spus | family_bucket | reason |
|---|---|---|---|---|---|---|
| 短袖衫 | T恤类 | high | 7424 | 277 | 上装 | 与 T恤类 的产品语义接近,属于命名粒度差异。 |
| 羽绒外套 | 羽绒服类 | high | 4485 | 186 | 上装 | 本质仍是羽绒服饰类。 |
| 专业跑步鞋 | 跑步鞋类 | high | 2183 | 99 | 鞋靴 | 是跑步鞋类的更细颗粒度命名。 |
| 双肩背包 | 包类 | high | 2037 | 91 | 配件/护具/包袜 | 明显是包类的细分表达。 |
| 基础跑步鞋 | 跑步鞋类 | high | 1329 | 62 | 鞋靴 | 是跑步鞋类的更细颗粒度命名。 |
| 短袖套装 | 套装类 | high | 1104 | 36 | 套装 | 属于套装的细分命名,应归并到既有 套装类。 |
| 长袖套装 | 套装类 | high | 1064 | 40 | 套装 | 属于套装的细分命名,应归并到既有 套装类。 |
| 羽绒背心 | 马甲类 | high | 898 | 39 | 裙装/内衣/泳装 | 核心仍是背心/马甲形态。 |
| 运动上衣类 | 针织运动上衣 | high | 867 | 10 | 上装 | 当前视频已有更接近的标准中类。 |
| 其他包 | 包类 | high | 401 | 19 | 配件/护具/包袜 | 明显是包类的兜底表达。 |
| 抓绒厚外套 | 抓绒衣类 | high | 227 | 2 | 上装 | 抓绒语义明确,应归并到 抓绒衣类。 |
| 棉外套 | 棉服类 | high | 204 | 9 | 上装 | 本质仍是棉服家族。 |
| 比赛上衣 | 专业比赛服类 | high | 178 | 2 | 上装 | 比赛上衣应作为比赛服的细分表达。 |
| 梭织运动套装 | 套装类 | high | 119 | 3 | 套装 | 材质前缀不改变主类,应归并到 套装类。 |
| 毛织/开衫 | 编织衫类 | high | 77 | 3 | 上装 | 针织/开衫与编织衫类高度同义。 |
| 针织衫 | 编织衫类 | high | 65 | 2 | 上装 | 与编织衫类高度同义。 |
| 综合训练鞋 | 健身鞋类 | high | 21 | 1 | 鞋靴 | 训练鞋语义明确,优先并到 健身鞋类。 |
| 短袖 | T恤类 | high | 10 | 10 | 其他 | 字面上是 T 恤家族的简写,优先归并到既有 T恤类。 |
| 套装(上-短袖T恤/下-运动短裤) | 套装类 | high | 10 | 1 | 裤装 | 这是套装类的展开描述,应收敛到 套装类。 |
| 运动鞋 | 运动生活鞋类 | medium | 12361 | 587 | 鞋靴 | 过于泛化,宜先收敛到广义鞋类标准枚举。 |
| 老爹鞋 | 运动生活鞋类 | medium | 11074 | 514 | 鞋靴 | 更像风格/楦型表达,宜先归并到广义生活鞋类。 |
| 长裤 | 运动裤类 | medium | 10602 | 469 | 裤装 | 通用裤装表达,宜先收敛到 运动裤类。 |
| 健步鞋 | 健身鞋类 | medium | 6122 | 278 | 鞋靴 | 更贴近训练/健步场景,可先并 健身鞋类。 |
| 软壳衣 | 冲锋衣类 | medium | 3604 | 17 | 上装 | 当前视频侧已有户外上装标准,软壳更适合作为其子表达。 |
| 短裤 | 运动裤类 | medium | 2533 | 99 | 裤装 | 通用裤装表达,宜先收敛到 运动裤类。 |
| 复古慢跑鞋 | 运动生活鞋类 | medium | 2156 | 101 | 鞋靴 | 属于生活化鞋型命名,先归并到生活鞋类。 |
| 长袖衫 | T恤类 | medium | 1507 | 65 | 上装 | 更像长袖 T 恤表达,优先考虑归并到 T恤类。 |
| 洞洞鞋 | 运动生活鞋类 | medium | 980 | 39 | 鞋靴 | 鞋型表达,先归并到生活鞋类。 |
| 高帮鞋 | 运动生活鞋类 | medium | 904 | 41 | 鞋靴 | 鞋帮高度是风格属性,先归并到生活鞋类。 |
| 休闲鞋 | 运动生活鞋类 | medium | 847 | 41 | 鞋靴 | 属于生活鞋类命名。 |
| 紧身裤 | 紧身衣 | medium | 820 | 42 | 裤装 | 当前视频标准没有独立紧身裤类,先与紧身类体系归并。 |
| 防晒服 | 外套 | medium | 800 | 27 | 上装 | 更像功能型外套表达,可先归并到 外套。 |
| 学步鞋 | 童鞋类 | medium | 553 | 31 | 鞋靴 | 核心是儿童鞋履,优先并到 童鞋类。 |
| 帆布鞋 | 运动生活鞋类 | medium | 537 | 26 | 鞋靴 | 与既有生活鞋类更接近。 |
| 拖鞋 | 运动生活鞋类 | medium | 445 | 22 | 鞋靴 | 当前视频类目没有独立拖鞋标准,先并入广义鞋类。 |
| 专业锻炼服 | 专业比赛服类 | medium | 321 | 2 | 上装 | 专业训练服与比赛服类存在较强口径重合。 |
| 背心 | 马甲类 | medium | 270 | 11 | 裙装/内衣/泳装 | 当前视频侧已有 马甲类,优先收敛。 |
| 冲锋裤类 | 软壳裤 | medium | 213 | 2 | 裤装 | 当前视频侧已有更接近的户外裤装标准。 |
| 梭织长裤 | 运动裤类 | medium | 188 | 5 | 裤装 | 材质+裤型,不必单立视频中类。 |
| 速干裤类 | 运动裤类 | medium | 53 | 28 | 裤装 | 功能型裤装表达,宜先并入运动裤类。 |
| 配件套装 | 套装类 | medium | 45 | 2 | 套装 | 仍然是套装表达,建议先并入 套装类。 |
| 九分裤 | 运动裤类 | medium | 42 | 2 | 裤装 | 裤长差异更像子属性。 |
| 紧身衣套装 | 套装类 | medium | 2 | 1 | 套装 | 优先按套装主类归并。 |
| 吊带/背心类 | 马甲类 | low | 25326 | 289 | 裙装/内衣/泳装 | 与马甲/背心家族有交集,但仍需业务确认是否拆分。 |
| 中国李宁鞋类 | 运动生活鞋类 | low | 10535 | 57 | 鞋靴 | 品牌口径混入中类,优先消解到广义鞋类。 |
| 浅口单鞋 | 运动生活鞋类 | low | 2549 | 123 | 鞋靴 | 鞋型表达,先并入生活鞋类。 |
| 泡泡鞋 | 运动生活鞋类 | low | 1505 | 71 | 鞋靴 | 款式表达,优先归并到生活鞋类。 |
| 灯鞋 | 运动生活鞋类 | low | 1066 | 63 | 鞋靴 | 功能款式命名,先归并到生活鞋类。 |
| 商务休闲鞋 | 运动生活鞋类 | low | 640 | 35 | 鞋靴 | 当前视频标准类目未见更细分商务鞋,先并生活鞋类。 |
| 包头凉鞋 | 运动生活鞋类 | low | 640 | 32 | 鞋靴 | 是凉鞋的细分鞋型,先并入广义鞋类。 |
| 露趾凉鞋 | 运动生活鞋类 | low | 241 | 15 | 鞋靴 | 是凉鞋的细分鞋型,先并入广义鞋类。 |
| 玛丽珍 | 运动生活鞋类 | low | 153 | 10 | 鞋靴 | 鞋型风格名,优先并入广义鞋类。 |
| 棉鞋 | 运动生活鞋类 | low | 144 | 9 | 鞋靴 | 更像季节性鞋型,优先并入生活鞋类。 |
| 闪钻鞋 | 运动生活鞋类 | low | 106 | 7 | 鞋靴 | 装饰风格词,不宜单列为视频标准中类。 |
| 工作鞋 | 运动生活鞋类 | low | 103 | 5 | 鞋靴 | 缺乏独立视频类目支撑,先作为生活鞋类候选归并。 |
| 大衣类 | 外套 | low | 65 | 2 | 上装 | 落在上装家族,但未命中明确规则;暂按广义上装归并,需人工复核。 |
| 鞋类配件类 | 运动生活鞋类 | low | 10 | 2 | 鞋靴 | 落在鞋靴家族,但未命中明确规则;暂按广义鞋类归并,需人工复核。 |
| 抓绒裤类 | 软壳裤 | low | 9 | 4 | 裤装 | 视频侧缺少独立抓绒裤标准,先临时并入户外裤类。 |
图片独有中类 vs 视频规则覆盖报告
生成时间:2026-04-20 17:13:07
分析目标
- 以图片素材表
data_dim.dim_picture_material_data_enriched.mid_cate为主参照。 - 对照视频来源层
data_dws.dws_platform_file_resource_label_id(file_type='视频')与视频结果层data_dws.dws_short_video_product_info.mid_cate。 - 结合历史规则脚本
sample-002.sql中的CASE WHEN t5.mid_cate ... THEN ...中类规整逻辑,判断图片独有中类到底属于“历史规则已支持但当前没数据”,还是“历史规则根本未覆盖”。
关键结论
- 图片独有中类共
118个。 - 其中
10个已经出现在历史视频规整规则的目标枚举中,说明这批值不是标准枚举空缺,而是视频来源覆盖不足或当前周期没有对应视频样本。 - 其中
0个出现在历史规则别名中。 - 其余
108个没有出现在历史视频规整规则里,才是真正的“视频规则未覆盖候选”。 - 视频来源层与结果层的中类枚举集合一致:来源层
40个,来源独有但结果层缺失0个。也就是说,这批问题不是dws_short_video_product_info聚合丢值,而是视频来源层本身就没有这些中类。
根因拆解
- 当前视频结果表链路在
current-table-01.sql中直接从data_dws.dws_platform_file_resource_label_id取mid_cate,并MAX(mid_cate)聚合写入dws_short_video_product_info,没有额外的视频中类规整补齐。 - 因此,只要视频来源层没有某个
mid_cate,结果层也不会凭空出现。 sample-002.sql提供的是另一套历史规整经验,它能帮助识别“这个枚举历史上是否被当成视频标准值或别名处理过”,但不能替代当前视频来源数据。
汇总
| 指标 | 数值 |
|---|---|
| picture_only_count | 118 |
| historical_target_defined_count | 10 |
| historical_alias_defined_count | 0 |
| historical_rule_uncovered_count | 108 |
| video_source_enum_count | 40 |
| video_source_only_enum_count | 0 |
未覆盖家族分布
| family_bucket | enum_count | picture_rows | picture_spus |
|---|---|---|---|
| 鞋靴 | 29 | 73010 | 2349 |
| 裙装/内衣/泳装 | 17 | 87504 | 1100 |
| 上装 | 16 | 23298 | 632 |
| 球拍球线/器材 | 14 | 41513 | 569 |
| 裤装 | 11 | 16792 | 694 |
| 配件/护具/包袜 | 10 | 18848 | 306 |
| 其他 | 6 | 6351 | 165 |
| 套装 | 5 | 2334 | 82 |
历史规则样例
| target | aliases |
|---|---|
| Polo类 | POLO、Polo类 |
| 其他鞋类 | 一脚蹬 |
| 专业比赛服类 | 专业比赛服、专业比赛服类 |
| 其他服装 | 中裤 |
| 休闲裤类 | 休闲裤、休闲裤类 |
| 其他器材类 | 其他器材类、其它器材 |
| 内裤类 | 内裤类、内裤 |
| 冬靴/雪地靴 | 冬靴/雪地靴/高帮、冬靴/雪地靴 |
| 冲锋衣类 | 冲锋衣 |
| 凉鞋类 | 凉鞋 |
| 包类 | 包包 |
| 匹克球鞋类 | 匹克球鞋 |
| 卫衣类 | 卫衣、卫衣卫裤套装 |
| 卫裤类 | 卫裤 |
| 套装类 | 多合一套装 |
| 套装类 | 套装(上-短袖T恤/下-运动短裤) |
| 帽类 | 帽子 |
| 户外鞋类 | 户外鞋 |
| 手套类 | 手套&围巾 |
| 板鞋 | 板鞋/帆布鞋 |
当前链路核对
| pattern_key | matched | line_no | line_text |
|---|---|---|---|
| video_insert | 1 | 462 | insert overwrite table data_dws.dws_short_video_product_info |
| video_source | 1 | 509 | FROM data_dws.dws_platform_file_resource_label_id |
| video_mid_agg | 1 | 484 | MAX(mid_cate) as mid_cate, |
图片独有中类明细
| enum_value | picture_rows | picture_spus | video_source_rows | video_final_rows | rule_status | suggested_target | family_bucket | same_family_video_enums | sample_spu_1 | sample_file_id_1 |
|---|---|---|---|---|---|---|---|---|---|---|
| 裙类 | 33455 | 464 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | AAPS250 | 0b75e80eaf1b3a75433aae723a9e0a32 | ||
| 吊带/背心类 | 25326 | 289 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | AAER190 | 119075f382b45fdf1ae6a6bb92ff242f | ||
| 球类 | 19437 | 297 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ABQE338 | db4c4daefd85cf9aba65c57205040c65 | |
| 乒乓球鞋类 | 12535 | 56 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | APPM001 | e5e898ba338f98b04850a35187751943 | |
| 运动鞋 | 12361 | 587 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 104337 | 1a14a1b242189f14f99c586491d25a54 | |
| 游泳衣类 | 11800 | 112 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | AKST871 | 028eb1f65a87bacdc76d4aae2a5dadd9 | ||
| 泳具类 | 11382 | 82 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | AQAT062 | 00a26f8db50486234d526fb1a167eb72 | ||
| 老爹鞋 | 11074 | 514 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 117040 | 066a2e6efea335b3867f1ba61fec79e1 | |
| 长裤 | 10602 | 469 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | L121B072 | 07a7abc29a0e5a9a2b2321e899e3b820 | |
| 中国李宁鞋类 | 10535 | 57 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | AECS091 | 001d09cb4febd6c794a8f17e73d15501 | |
| 拍类 | 10343 | 120 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | AYPG354 | 00f1d691ca409c55bfc83be945ae0a89 | |
| 手套类 | 9172 | 97 | 0 | 0 | 历史规则目标已定义 | 手套类 | 配件/护具/包袜 | 包类、帽类、袜类 | AQAU073 | 089dcfa4d123f328cb4dad0fd4412552 |
| 短袖衫 | 7424 | 277 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | L121K121 | 05076aea8bd646c56b5e926e99070a19 | |
| 足球鞋类 | 7370 | 39 | 0 | 0 | 历史规则目标已定义 | 足球鞋类 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 104622 | 03fce9d8b4a9edc6c779238ce45d2bae |
| 基础护具 | 6286 | 71 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | AHJQ004 | 0c23a942e5452477202d9432cc6f038e | |
| 健步鞋 | 6122 | 278 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 100737 | 09db3066b8438bb49b8f42bdaf3d9a3c | |
| 护具类 | 5773 | 74 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | AXWE368 | 031afe95bd518309c76136f2af4d028d | |
| 其他器材类 | 5473 | 62 | 0 | 0 | 历史规则目标已定义 | 其他器材类 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | AQDU007 | 00931ecc0d28d3f1347105dc57b9ddd6 |
| 羽毛球柄皮 | 5374 | 29 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ASJT043 | 02a1e2a8d0194fc8e417333eee45d803 | |
| 配饰类 | 5093 | 84 | 0 | 0 | 历史规则未覆盖 | 其他 | T恤类、Polo类 | ABJS073 | 0c1bf3e9255e9c2ec81bf3cb94bd3e74 | |
| 羽绒外套 | 4485 | 186 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | L321B089 | 0316d55918e1cb30af76d52099392be1 | |
| 软壳衣 | 3604 | 17 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AFDU348 | 00ab7ab0cb3bab704bf11ad86f5001de | |
| 内裤类 | 3270 | 39 | 0 | 0 | 历史规则目标已定义 | 内裤类 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | ANKP019 | 2c3bf508ae2e0e92eef0f294a02c3d7e |
| 滑雪服 | 3086 | 23 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AHXL003 | 8651e6de86675948ed03ac6a36ba884e | |
| 其它配件 | 2991 | 29 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | ALEW001 | 108624eb85ee6935c1b8dd23093bf76c | |
| 板鞋 | 2845 | 138 | 0 | 0 | 历史规则目标已定义 | 板鞋 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 104782 | 1163e16d3fcac7558ebfe084e0246d76 |
| 冬靴/雪地靴 | 2677 | 136 | 0 | 0 | 历史规则目标已定义 | 冬靴/雪地靴 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 114270 | 30eb57b3f394b90f65302ee4fc09b130 |
| 浅口单鞋 | 2549 | 123 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 100022 | 06ccd56b47cbb1dbdb2f6bb6e16a4f1c | |
| 短裤 | 2533 | 99 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | AKSW356 | a2cec50c518fcca2aeb00fb49f88c700 | |
| 专业跑步鞋 | 2183 | 99 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 128079 | 023f3b5f3ebd305a5165dc11e9d8c29b | |
| 匹克球拍 | 2162 | 41 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ACPV007 | 04c45f1d57b1fa4b5edfb020e49fee9a | |
| 复古慢跑鞋 | 2156 | 101 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 117077 | 019c69ac444731273d5d0764dbc4753c | |
| 凉鞋类 | 2068 | 89 | 0 | 0 | 历史规则目标已定义 | 凉鞋类 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 113541 | 00d8409e3b78cb279371850b809ed2ad |
| 网球鞋类 | 2049 | 9 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | ATAV003 | 012913747cff63554942b5b67da7b5da | |
| 双肩背包 | 2037 | 91 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | L121K003 | 268d27ddf6cbd478a9074880c7172737 | |
| 其他服装 | 1881 | 60 | 0 | 0 | 历史规则目标已定义 | 其他服装 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AQCS001 | 0190efc9d17c92aecf912fade07d6a42 |
| 网球拍 | 1559 | 32 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | AWPV001 | 03acb2c485d7a98cbca47eed30409a78 | |
| 长袖衫 | 1507 | 65 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | L122K097 | 18af8ba33d0824020f418c63d9a97e14 | |
| 泡泡鞋 | 1505 | 71 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 111054 | 1a1e238c3309f0cc1654628347a0f613 | |
| 内衣 | 1383 | 19 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | ANKS006 | 01687ddf4df1447bf1c788fc1bcd8547 | ||
| 基础跑步鞋 | 1329 | 62 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 128076 | 04670f6e979af1a3b6a4be1eb99162d0 | |
| 夹棉裤类 | 1283 | 28 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | AKMJ045 | 23d30bbc4ad0b210286c7aedb6f71c8b | |
| 高尔夫鞋 | 1178 | 11 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | AGFT006 | 033a07c73a45af4f0153cc3243aed843 | |
| 短袖套装 | 1104 | 36 | 0 | 0 | 历史规则未覆盖 | 套装 | 套装类 | L122B069 | 0889bc3d9dbbb60b5fcbfe63a0430e1b | |
| 灯鞋 | 1066 | 63 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 20180L | 0feebe9598533785aa17834b21666f1c | |
| 长袖套装 | 1064 | 40 | 0 | 0 | 历史规则未覆盖 | 套装 | 套装类 | L122K101 | 04558d27bbd627ae7fd89c35d670b5ab | |
| 羽绒裤类 | 1039 | 14 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | YKMQ007 | 07377e79a785311d377dec68d34b88f4 | |
| 连体衣 | 1013 | 11 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | L222G156 | 08667c8bed562de020d3fa8d94f9d47b | ||
| 洞洞鞋 | 980 | 39 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 111090 | 0298b7f54cf420912a072e3c84d2a4ea | |
| 高帮鞋 | 904 | 41 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 113437 | 1abf091a371b6c34d305529690aa2a76 | |
| 羽绒背心 | 898 | 39 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | L322K034 | 047b29c4c2301a6c478965013cecaee4 | ||
| 运动上衣类 | 867 | 10 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AJDP436 | a188a4f62bd26f83b3e0a468a77c8650 | |
| 休闲鞋 | 847 | 41 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 100677 | 06646278951464171db236130d360986 | |
| 推广品类 | 844 | 54 | 0 | 0 | 历史规则未覆盖 | 其他 | T恤类、Polo类 | ABDV415 | 0b202217720b9b1f7522ed3b999328ce | |
| 球拍配件类 | 843 | 16 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ASJT045 | 4d5a2c06b661691b61ca12b6ef64d238 | |
| 围巾 | 821 | 14 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | AWJQ016 | 0ffbc5f7643a9bf5bf6d9684b774c178 | |
| 紧身裤 | 820 | 42 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | AULM039 | 6c890e41d5fdde6d57b492f9b83199d2 | |
| 防晒服 | 800 | 27 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | L224M030 | 27eb9a1647359133bc74a93e589ce597 | |
| 商务休闲鞋 | 640 | 35 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 200293 | 1f9cf08d893a038325c75192f2b684fe | |
| 包头凉鞋 | 640 | 32 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 302100L | 09b125c362e8e04da0e9e5250879e43c | |
| 半裙 | 627 | 29 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | L123W044 | 0629992d5bb36ae7c6526287c3945669 | ||
| 学步鞋 | 553 | 31 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 302552N | 082a6c7d4bc8ef22c2d2da11c4923788 | |
| 帆布鞋 | 537 | 26 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 113305 | 1ea6fbb75eaf4e41171e14e8507a29f3 | |
| 小器材 | 484 | 7 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | AQER008 | 073a985541ec406baf9c11ca0ff72005 | |
| 匹克球鞋类 | 474 | 3 | 0 | 0 | 历史规则目标已定义 | 匹克球鞋类 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 172110C | 063218b8f582af1cc630d3acf0fb2421 |
| 拖鞋 | 445 | 22 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 100673 | 3623d5903455fcb0e2ee17e612aa3a96 | |
| 网球线 | 404 | 4 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ATSV491 | 00ba442c96f0afdef98998ba8c241438 | |
| 其他包 | 401 | 19 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | L124U068 | 0e99b1eb3fc2f2a2c0c93f367bf0c03c | |
| 运动用品 | 360 | 11 | 0 | 0 | 历史规则未覆盖 | 其他 | T恤类、Polo类 | AYDT001 | 02c59b35e36d148b39d3e31bd90d3bd6 | |
| 婴幼儿服装类 | 327 | 4 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | YAAP002 | 02af7dc605ec205d43aa419878ba8bdb | |
| 专业锻炼服 | 321 | 2 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | ANFV001 | 00d5bf1379916d3ab9948f8e7abbad6e | |
| 连衣裙 | 294 | 18 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | L123G004 | 05eedc20a65ebfe85555a39b03764e40 | ||
| 泳帽 | 274 | 1 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | ASYU034 | 009c9d1e3a5e6b991e4b174b47f1627d | ||
| 背心 | 270 | 11 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | L124U178 | 0eb94e8913dbfa37e278546699b18adc | ||
| 网球 | 257 | 6 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | AWQV001 | 0d89d2418db01578eb8f99d5e93733c0 | |
| 运动型内衣 | 246 | 2 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | YUCV008 | 0031fbf9a747e888c3d6776526601330 | ||
| 露趾凉鞋 | 241 | 15 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 20215L | 0c7e5287d7c2ea83f654264374a67a4d | |
| 运动内衣 | 237 | 12 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | AUCR008 | 01f5daf4e156c324590278025eb67bc7 | ||
| 抓绒厚外套 | 227 | 2 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AFDU487 | 0221dd7cd55aa33681c8c784d20c2d19 | |
| 公仔 | 219 | 2 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | AGZR002 | 04e6b25f7a39ae9724fae41474f92176 | |
| 匹克球 | 213 | 3 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ACPV001 | 0173a2e7202d7fbfc5c6d9e307f05a0c | |
| 冲锋裤类 | 213 | 2 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | AELU003 | 00a561d3eeedc25621cf6c92d04ec9dd | |
| 棉外套 | 204 | 9 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | L123M001 | 1e9ab513bb6057bdd7376b6432821e0a | |
| 壁球拍 | 190 | 4 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ABPV023 | 060c8ee6d234b514afe6b3251377da37 | |
| 梭织长裤 | 188 | 5 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | ACKW002 | 006dfffbb7fefee8728deef11bf715f0 | |
| 比赛上衣 | 178 | 2 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AAYW015 | 0154598ef4ece9d8e1b3f97c8a358b48 | |
| 玛丽珍 | 153 | 10 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 302513L | 01f4291f46365169b4b809db245adcc7 | |
| 水壶 | 152 | 3 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | AQTS365 | 19e15110507377ff46029605bf8345b1 | |
| 棉鞋 | 144 | 9 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 302524L | 015682556e1a13186ad1ac8cc52d0cd7 | |
| 玩偶 | 143 | 1 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | AGZS001 | 00f4eb8990f4a9802411074da1051311 | |
| 壁球 | 132 | 4 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | ABQV115 | 02313f9831d73c06203f55cb0a06c89c | |
| 梭织运动套装 | 119 | 3 | 0 | 0 | 历史规则未覆盖 | 套装 | 套装类 | AACL001 | 4d69c1012da134e09b189b7d9f6292be | |
| 连身衣 | 113 | 3 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | AABW002 | 17bd090d4145e92da05d50c41c96f076 | ||
| 马丁靴 | 112 | 5 | 0 | 0 | 历史规则目标已定义 | 马丁靴 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 113399 | 07754015636330bf4137781b6c61e51d |
| 耗材 | 107 | 5 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | APGR001 | 07af2c4fa509e7c2c24e16c495bcac3c | |
| 闪钻鞋 | 106 | 7 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 314350L | 11163beb4711a7f09a6edc2fdb3311c5 | |
| 工作鞋 | 103 | 5 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 108149 | 22c6d0a78299b2f7a1bbb2ed18ac50a7 | |
| 泳镜 | 89 | 3 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | ASJU023 | 4a70f30ed914a99b4d630ecdbf986798 | ||
| 泳装 | 83 | 4 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | P223B088 | 13b56b0e978d2e68d1b15bf55435c211 | ||
| 毛织/开衫 | 77 | 3 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | L323U070 | 043401364342de074df75483bc1bb5bf | |
| 大衣类 | 65 | 2 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | ADYR002 | 003f70f0a53695d06f02b2d6d6a281c8 | |
| 针织衫 | 65 | 2 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AAEQ011 | 1499497151366c45b09e37aa62a1ebb6 | |
| 防撞服 | 61 | 1 | 0 | 0 | 历史规则未覆盖 | 上装 | 羽绒服类、外套、卫衣类、专业比赛服类、棉服类、冲锋衣类、编织衫类、抓绒衣类、衬衫类、马甲类、针织运动上衣、套头衫 | AULT527 | 04620cff374de5313df8d131ee6af22f | |
| 速干裤类 | 53 | 28 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | AEKL005 | 295703ca718f954e8bb5904aabaf543b | |
| 配件套装 | 45 | 2 | 0 | 0 | 历史规则未覆盖 | 套装 | 套装类 | L422K008 | 04b55a775a000193e589b5b809f22ca2 | |
| 田径鞋类 | 44 | 2 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | AJJV001 | 0128afbea281ab8b211ea7bfbbccd092 | |
| 九分裤 | 42 | 2 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | P225W119 | 00447b00789d4615a2ad48f3252bf122 | |
| 运动装备 | 40 | 2 | 0 | 0 | 历史规则未覆盖 | 其他 | T恤类、Polo类 | P224U056 | 01da639987451a7b93db23ba77447729 | |
| 其他配件 | 25 | 2 | 0 | 0 | 历史规则未覆盖 | 配件/护具/包袜 | 包类、帽类、袜类 | L422B057 | 0d9fe7ab7a7894b0ded1e103541d1f1e | |
| 综合训练鞋 | 21 | 1 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | 183330 | 1343e63b77a03b0fcd39ca8083c96543 | |
| 背带裙 | 14 | 1 | 0 | 0 | 历史规则未覆盖 | 裙装/内衣/泳装 | L223G110 | 0f7323a68919176d4678d4acdfd2e74a | ||
| 短袖 | 10 | 10 | 0 | 0 | 历史规则未覆盖 | 其他 | T恤类、Polo类 | AHSW729 | c36b7318c1e10596dfcc0300c3eeb39f | |
| 鞋类配件类 | 10 | 2 | 0 | 0 | 历史规则未覆盖 | 鞋靴 | 运动生活鞋类、篮球鞋类、跑步鞋类、童鞋类、户外鞋类、健身鞋类、羽毛球鞋类、运动时尚鞋、其他鞋类、滑板鞋类 | AXZP001 | 023250d86daf13eb9a23020843cdb983 | |
| 套装(上-短袖T恤/下-运动短裤) | 10 | 1 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | ADTP001 | 1cebc18c15d2558626934a4fa0e8ed1b | |
| 抓绒裤类 | 9 | 4 | 0 | 0 | 历史规则未覆盖 | 裤装 | 卫裤类、运动裤类、针织运动裤、休闲裤类、软壳裤、牛仔裤类 | AEPL001 | 4547c326ecbdd89333be72f8578db7a0 | |
| 器械类 | 8 | 1 | 0 | 0 | 历史规则未覆盖 | 球拍球线/器材 | 羽毛球拍、羽毛球、羽毛球线 | DXFC008 | 0c8e984beac4e808294a7aebd3e2f3d8 | |
| 赠品 | 4 | 4 | 0 | 0 | 历史规则未覆盖 | 其他 | T恤类、Polo类 | APBD014 | 4319b6f9c42c91d2aabd9e59a8ec590b | |
| 紧身衣套装 | 2 | 1 | 0 | 0 | 历史规则未覆盖 | 套装 | 套装类 | AAGP003 | 4e28d5fc02731f78f70f1e4d3a8d32ff |
建议
历史规则目标已定义:先不要急着新增视频枚举,应先排查视频来源层是否有对应素材、标签是否没打上,或当前周期视频样本覆盖不足。历史规则未覆盖:这批才是优先级最高的候选,需要业务判断是新增视频标准枚举,还是归并到同家族已有枚举。- 像
球类这种值,当前视频来源层无数据、历史规则也未覆盖,更接近“新增枚举或新增归并规则候选”,而不是下游丢值。
sample-002 性别字段异常检测报告
- 生成时间:2026-04-21 16:27:46
- SQL 文件:
/Users/windwheel/.copaw/workspaces/sample-002.sql - 目标表:
data_dwd.dwd_file_label_id_spu
一、关键结论
- 目标表 data_dwd.dwd_file_label_id_spu 中 gender='无' 共 889755 行,占目标表 13.8575% 。
- tb16 按 SPU 看,
性别空值 SPU 数为 2316,性别_李宁bi空值 SPU 数为 82532。如果后者显著更高,说明 sample-002 当前取错了性别来源字段。 gender='无'的主因是 TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY,涉及 623264 行、17133 个 SPU。- 存在大量样本在 tb16.性别 有值,但 tb16.性别_李宁bi 为空,说明当前 SQL 取
性别_李宁bi会把本可映射的 SPU 误写成无。 - 存在一批
dwd_file_label_id_spu的 SPU 在 tb16 完全对不上,这部分即使改映射规则也仍会落成无,需要补查上游 SPU 对齐。
二、目标表 gender 分布
| gender | row_cnt | spu_cnt |
|---|---|---|
| 男性 | 2485358 | 14659 |
| 女性 | 1216911 | 7564 |
| 中性 | 1075888 | 5984 |
| 无 | 889755 | 23590 |
| 童 | 752840 | 3581 |
三、tb16 原始字段分布
3.1 性别
| gender_tb16 | row_cnt | spu_cnt |
|---|---|---|
| 男 | 348823 | 47361 |
| 女 | 205153 | 38604 |
| 中性 | 173899 | 19143 |
| 童 | 49238 | 2028 |
| 其它 | 7244 | 4205 |
| <<EMPTY>> | 3854 | 2316 |
3.2 性别_李宁bi
| gender_lining_bi | row_cnt | spu_cnt |
|---|---|---|
| 男 | 274308 | 16224 |
| <<EMPTY>> | 242292 | 82532 |
| 女 | 124230 | 9528 |
| 中 | 106567 | 6660 |
| 男童 | 27830 | 2467 |
| 童 | 9195 | 548 |
| 女童 | 2324 | 592 |
| 婴幼儿 | 820 | 62 |
| 中性 | 617 | 118 |
| 无 | 28 | 8 |
四、gender=无 根因拆解
| root_cause | row_cnt | spu_cnt |
|---|---|---|
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 623264 | 17133 |
| NO_TB16_MATCH | 265008 | 6444 |
| LINING_BI_IS_WU | 1326 | 8 |
| TB16_BOTH_EMPTY | 157 | 5 |
五、抽样
| root_cause | file_id | spu | final_gender | gender_tb16 | gender_lining_bi |
|---|---|---|---|---|---|
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 8dbe335dc1ee8b84802949852fe0bec3 | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 855507e4c36c4b726f77e4dce9ec9c4b | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 39444d16a8bbdf1ab084326f5d1d7bb7 | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 5331db9da3da66c0f351100d90aa385f | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | eaa911bdfaf1002b4baec301e27080c5 | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | b827c25bdf0b6ddfef8a476b93a1a155 | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 5acc410911a848551fa213c7b475f3e9 | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 20415199b66fb90cd68cad268850785a | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 8165127b59585a58197a8b35b062aeaa | 100349 | 无 | 女 | <<EMPTY>> |
| TB16_GENDER_PRESENT_BUT_LINING_BI_EMPTY | 9a3e4c2b590c1aa30d9e7f637d82a425 | 100349 | 无 | 女 | <<EMPTY>> |
| NO_TB16_MATCH | c26578d3f37d0521215ad31a88375a7f | 319005 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | 1da4db3303c6a5c5406ee47becbdd3b5 | 319005 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | 96e97ac7c31fc90bdeeb15ca94d02090 | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | a6785923aa2d2c9fa982ffb6774d3bc2 | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | ec4e72b78a298fbcb56b2581a002ba23 | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | 4235318d75db7cc9b4f1bd279382db0b | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | b9df5f95f1119ebb0e6c7615a4379e7d | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | 600e99ba2ba0afef04e16a2c488f1346 | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | e5bdf95bdafd5da48150c509e1cebe56 | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| NO_TB16_MATCH | ce1ab601aa5d38141d0850b676a4822b | 664094 | 无 | <<EMPTY>> | <<EMPTY>> |
| LINING_BI_IS_WU | c10ee3ad6309f14206eef21a6d7ee7b8 | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | 2ae69b6ea140b6cd8ae615f2ef699bf2 | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | 013eff6decaa4fbdcb7ae8d53003fa0b | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | a51a8fc6778d530677b8b0a423cd633d | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | f061836246f9ededf90018b48a7f3b44 | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | 564ee49ce61ba325a87d1e3bf4e8a44d | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | ad3f79977a158937ccd8281727998c21 | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | 751ff80ae538e70c4ed78e8bf83e3835 | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | 314173e44661e3132bb3b5cbf9a97108 | AYTS016 | 无 | 中性 | 无 |
| LINING_BI_IS_WU | af51dde505a7e1907f5f877801e1ef47 | AYTS016 | 无 | 中性 | 无 |
| TB16_BOTH_EMPTY | dbf15eed8c0286f91d920d67b48beab5 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | 032bef297ec71f04550e67df4f7b96e5 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | 6ec274419cca5779def7a2de37998543 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | f52c278a9fc4225603271b60399e7276 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | acb52b0d754e36d67a1fe237092ae262 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | 26ea7ba14fcccc688f1e05988d7035f3 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | 175ccd12cdbfadd7d412b0fbf8bafbb6 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | c238fc3f646733968f2bbdc4ca157c64 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | c5e4e406cb287a9654340970c884f52d | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
| TB16_BOTH_EMPTY | eb7ed4e2a2a539b375602f400c47c871 | AMBW102 | 无 | <<EMPTY>> | <<EMPTY>> |
SPU 聚类与商品维度分布报告
生成时间:2026-04-20 15:03:35
一、dwd_file_label_id_spu 按 SPU 聚类 Top10
- 表:
data_dwd.dwd_file_label_id_spu - 总行数:6431056
- 唯一 SPU 数:55382
- 聚类组合数:1207
- 聚类维度:
big_cate,mid_cate,sub_track,gender,scene,style - Top10 聚类累计概率:27.77%
- 图表输出:当前环境未安装
matplotlib,已在 Excel 文件中内嵌概率分布图。
| cluster_label | spu_count | probability | cumulative_probability |
|---|---|---|---|
| big_cate=无 | mid_cate=无 | sub_track=其他 | gender=无 |
| big_cate=服装 | mid_cate=卫衣类 | sub_track=其他 | gender=无 |
| big_cate=服装 | mid_cate=卫衣类 | sub_track=其他 | gender=男性 |
| big_cate=服装 | mid_cate=T恤类 | sub_track=其他 | gender=男性 |
| big_cate=服装 | mid_cate=T恤类 | sub_track=其他 | gender=无 |
| big_cate=服装 | mid_cate=卫裤类 | sub_track=其他 | gender=无 |
| big_cate=鞋 | mid_cate=童鞋类 | sub_track=其他 | gender=童 |
| big_cate=配件 | mid_cate=包类 | sub_track=其他 | gender=中性 |
| big_cate=服装 | mid_cate=外套 | sub_track=其他 | gender=无 |
| big_cate=服装 | mid_cate=卫裤类 | sub_track=其他 | gender=男性 |
二、tb16_dim_product_sale_dimension 重点维度 Top20
- 表:
data_dim.tb16_dim_product_sale_dimension - 总行数:794818
- 唯一 SPU 数:112201
产品名称 Top20
- 实际字段:
产品名称 - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 574271 | 72.25% | 72.25% |
| 轻量运动 | 12639 | 1.59% | 73.84% |
| 周末青年 | 7857 | 0.99% | 74.83% |
| 运动必备 | 6916 | 0.87% | 75.70% |
| 球迷风 | 5612 | 0.71% | 76.41% |
| 繁体李宁 | 4330 | 0.54% | 76.95% |
| 凉茶 | 3338 | 0.42% | 77.37% |
| 运动灵感 | 3079 | 0.39% | 77.76% |
| 机能全天候 | 2376 | 0.30% | 78.06% |
| LOGO实验室 | 2281 | 0.29% | 78.34% |
| 反伍场下 | 2260 | 0.28% | 78.63% |
| 赤兔8 PRO | 1821 | 0.23% | 78.86% |
| 羽绒服 | 1817 | 0.23% | 79.09% |
| LOGO-CORE | 1779 | 0.22% | 79.31% |
| 赤兔8 | 1662 | 0.21% | 79.52% |
| 日常跑 | 1530 | 0.19% | 79.71% |
| 赤兔7 | 1398 | 0.18% | 79.89% |
| 主题大LOGO | 1386 | 0.17% | 80.06% |
| LOGO-涂鸦 | 1313 | 0.17% | 80.23% |
| 穗岁 | 1287 | 0.16% | 80.39% |
品牌大类 Top20
- 实际字段:
品牌大类 - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 服装 | 394823 | 49.67% | 49.67% |
| 鞋 | 287438 | 36.16% | 85.84% |
| 配件 | 52668 | 6.63% | 92.47% |
| 服饰 | 43328 | 5.45% | 97.92% |
| 无 | 9556 | 1.20% | 99.12% |
| 器材 | 4005 | 0.50% | 99.62% |
| 推广品 | 543 | 0.07% | 99.69% |
| 碳黑 | 193 | 0.02% | 99.72% |
| 全黑色 | 73 | 0.01% | 99.72% |
| 全黑色B BK | 68 | 0.01% | 99.73% |
| 黑色B LK | 50 | 0.01% | 99.74% |
| 赠品 | 46 | 0.01% | 99.74% |
| 碳黑0018 | 44 | 0.01% | 99.75% |
| 黑色/白色B KW | 43 | 0.01% | 99.76% |
| 黑色 | 39 | 0.00% | 99.76% |
| 棉花糖白 | 29 | 0.00% | 99.76% |
| 黑色/白色 | 26 | 0.00% | 99.77% |
| 黑色0018 | 25 | 0.00% | 99.77% |
| 乳白色 | 24 | 0.00% | 99.77% |
| 潜望镜灰 | 22 | 0.00% | 99.78% |
品牌中类 Top20
- 实际字段:
品牌中类 - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| T恤类 | 137784 | 17.34% | 17.34% |
| 无 | 79184 | 9.96% | 27.30% |
| 运动生活鞋类 | 56544 | 7.11% | 34.41% |
| 卫衣类 | 53117 | 6.68% | 41.09% |
| 跑步鞋类 | 51959 | 6.54% | 47.63% |
| 童鞋类 | 47467 | 5.97% | 53.60% |
| 卫裤类 | 38804 | 4.88% | 58.49% |
| 外套 | 33637 | 4.23% | 62.72% |
| 运动裤类 | 23754 | 2.99% | 65.71% |
| 篮球鞋类 | 23544 | 2.96% | 68.67% |
| 羽绒服类 | 19057 | 2.40% | 71.07% |
| 包类 | 13736 | 1.73% | 72.79% |
| 短袖T恤 | 11537 | 1.45% | 74.25% |
| 专业比赛服类 | 10721 | 1.35% | 75.60% |
| 袜类 | 10362 | 1.30% | 76.90% |
| 运动时尚鞋 | 9746 | 1.23% | 78.13% |
| 帽类 | 7584 | 0.95% | 79.08% |
| Polo类 | 6726 | 0.85% | 79.93% |
| 低帮鞋 | 6662 | 0.84% | 80.76% |
| 户外鞋类 | 6394 | 0.80% | 81.57% |
细分赛道 Top20
- 实际字段:
抖音成人商品_细分赛道 - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 506867 | 63.77% | 63.77% |
| 短袖T恤 | 64504 | 8.12% | 71.89% |
| 运动长裤 | 23559 | 2.96% | 74.85% |
| 夹克外套 | 22129 | 2.78% | 77.64% |
| 卫衣 | 17984 | 2.26% | 79.90% |
| 经典板鞋 | 15454 | 1.94% | 81.84% |
| 缓震跑 | 15418 | 1.94% | 83.78% |
| 篮球鞋 | 14518 | 1.83% | 85.61% |
| 羽绒服 | 10023 | 1.26% | 86.87% |
| 竞训 | 9612 | 1.21% | 88.08% |
| 老爹鞋 | 9407 | 1.18% | 89.26% |
| 其他服装 | 8043 | 1.01% | 90.27% |
| 包 | 7965 | 1.00% | 91.28% |
| 运动短裤 | 7343 | 0.92% | 92.20% |
| 户外鞋 | 6570 | 0.83% | 93.03% |
| 袜 | 5775 | 0.73% | 93.75% |
| 潮流休闲 | 5051 | 0.64% | 94.39% |
| 基础跑 | 4693 | 0.59% | 94.98% |
| 舒适漫步 | 4640 | 0.58% | 95.56% |
| 基础板鞋 | 4522 | 0.57% | 96.13% |
性别 Top20
- 实际字段:
性别_李宁bi - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 男 | 274108 | 34.49% | 34.49% |
| 无 | 249371 | 31.37% | 65.86% |
| 女 | 124129 | 15.62% | 81.48% |
| 中 | 106440 | 13.39% | 94.87% |
| 男童 | 27830 | 3.50% | 98.37% |
| 童 | 9179 | 1.15% | 99.53% |
| 女童 | 2324 | 0.29% | 99.82% |
| 婴幼儿 | 820 | 0.10% | 99.92% |
| 中性 | 617 | 0.08% | 100.00% |
风格 Top20
- 实际字段:
风格 - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 375148 | 47.20% | 47.20% |
| 其它 | 181424 | 22.83% | 70.03% |
| 时尚 | 109307 | 13.75% | 83.78% |
| 运动 | 102137 | 12.85% | 96.63% |
| 休闲 | 15607 | 1.96% | 98.59% |
| 户外 | 10296 | 1.30% | 99.89% |
| 其他 | 899 | 0.11% | 100.00% |
适用场景 Top20
- 实际字段:
适用场景 - 分布图:见 Excel 内嵌图表。
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 其它 | 393704 | 49.53% | 49.53% |
| 无 | 375148 | 47.20% | 96.73% |
| 慢跑 | 13438 | 1.69% | 98.42% |
| 竞训 | 7715 | 0.97% | 99.39% |
| 健步 | 3656 | 0.46% | 99.85% |
| 专业马拉松 | 639 | 0.08% | 99.93% |
| 越野跑 | 517 | 0.07% | 100.00% |
| 长跑 | 1 | 0.00% | 100.00% |
短视频与图片 SPU/中类/赛道聚类报告
生成时间:2026-04-20 15:47:07
说明:
dws_short_video_product_info与dim_picture_material_data_enriched已按全量分布统计,不再截 Top20。- 由于
spu与聚类组合基数较大,PDF/Markdown 正文只展示摘要和部分样例;全量明细见 JSON / Excel。 - 概率分布图已内嵌在 Excel 中。
一、dws_short_video_product_info 聚类分析
- 表:
data_dws.dws_short_video_product_info - 总行数:77951
- 唯一 SPU 数:2139
- 唯一素材 ID 数:0
- 聚类字段:
spu=spu,mid_cate=mid_cate,track=track - 聚类组合数:2140
spu分布基数:2140mid_cate分布基数:41track分布基数:31
全量聚类分布摘要
- 聚类组合总数:2140
- Top1 聚类:
spu=无 | mid_cate=无 | track=其他,占比 13.28% - Top10 聚类累计占比:22.53%
聚类样例(前20)
| cluster_label | row_count | probability | cumulative_probability |
|---|---|---|---|
| spu=无 | mid_cate=无 | track=其他 | 10354 |
| spu=AGCU275 | mid_cate=运动生活鞋类 | track=经典板鞋 | 1226 |
| spu=AGCV077 | mid_cate=运动生活鞋类 | track=经典板鞋 | 859 |
| spu=ARSV023 | mid_cate=跑步鞋类 | track=缓震跑 | 789 |
| spu=AGLW196 | mid_cate=运动生活鞋类 | track=薄底鞋 | 775 |
| spu=ARSW035 | mid_cate=跑步鞋类 | track=缓震跑 | 753 |
| spu=ARPW001 | mid_cate=跑步鞋类 | track=竞训 | 745 |
| spu=ABPV009 | mid_cate=篮球鞋类 | track=篮球鞋 | 741 |
| spu=YKCV202 | mid_cate=童鞋类 | track=其他 | 695 |
| spu=ARSV093 | mid_cate=跑步鞋类 | track=缓震跑 | 626 |
| spu=AGCV331 | mid_cate=运动生活鞋类 | track=经典板鞋 | 617 |
| spu=AGLV204 | mid_cate=运动生活鞋类 | track=薄底鞋 | 573 |
| spu=ABAU037 | mid_cate=篮球鞋类 | track=篮球鞋 | 572 |
| spu=ABAV059 | mid_cate=篮球鞋类 | track=篮球鞋 | 568 |
| spu=ABAV007 | mid_cate=篮球鞋类 | track=篮球鞋 | 550 |
| spu=ABFT035 | mid_cate=篮球鞋类 | track=篮球鞋 | 542 |
| spu=ABAT057 | mid_cate=篮球鞋类 | track=篮球鞋 | 535 |
| spu=ARST003 | mid_cate=跑步鞋类 | track=缓震跑 | 520 |
| spu=ABPT001 | mid_cate=篮球鞋类 | track=篮球鞋 | 465 |
| spu=ABFU019 | mid_cate=篮球鞋类 | track=篮球鞋 | 463 |
spu 全量分布摘要
- 不同取值数:2140
- Top1:
无,占比 13.28% - Top10 累计占比:22.53%
spu 分布样例
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 10354 | 13.28% | 13.28% |
| AGCU275 | 1226 | 1.57% | 14.86% |
| AGCV077 | 859 | 1.10% | 15.96% |
| ARSV023 | 789 | 1.01% | 16.97% |
| AGLW196 | 775 | 0.99% | 17.96% |
| ARSW035 | 753 | 0.97% | 18.93% |
| ARPW001 | 745 | 0.96% | 19.89% |
| ABPV009 | 741 | 0.95% | 20.84% |
| YKCV202 | 695 | 0.89% | 21.73% |
| ARSV093 | 626 | 0.80% | 22.53% |
| AGCV331 | 617 | 0.79% | 23.32% |
| AGLV204 | 573 | 0.74% | 24.06% |
| ABAU037 | 572 | 0.73% | 24.79% |
| ABAV059 | 568 | 0.73% | 25.52% |
| ABAV007 | 550 | 0.71% | 26.23% |
| ABFT035 | 542 | 0.70% | 26.92% |
| ABAT057 | 535 | 0.69% | 27.61% |
| ARST003 | 520 | 0.67% | 28.27% |
| ABPT001 | 465 | 0.60% | 28.87% |
| ABFU019 | 463 | 0.59% | 29.46% |
mid_cate 全量分布摘要
- 不同取值数:41
- Top1:
运动生活鞋类,占比 21.79% - Top10 累计占比:95.20%
mid_cate 分布样例
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 运动生活鞋类 | 16983 | 21.79% | 21.79% |
| 篮球鞋类 | 14409 | 18.48% | 40.27% |
| 跑步鞋类 | 13694 | 17.57% | 57.84% |
| 无 | 10507 | 13.48% | 71.32% |
| 童鞋类 | 7395 | 9.49% | 80.80% |
| T恤类 | 3670 | 4.71% | 85.51% |
| 羽绒服类 | 2885 | 3.70% | 89.21% |
| 外套 | 1769 | 2.27% | 91.48% |
| 户外鞋类 | 1451 | 1.86% | 93.34% |
| 卫衣类 | 1445 | 1.85% | 95.20% |
| 卫裤类 | 925 | 1.19% | 96.38% |
| 运动裤类 | 767 | 0.98% | 97.37% |
| 套装类 | 422 | 0.54% | 97.91% |
| 专业比赛服类 | 350 | 0.45% | 98.36% |
| Polo类 | 275 | 0.35% | 98.71% |
| 棉服类 | 271 | 0.35% | 99.06% |
| 包类 | 208 | 0.27% | 99.33% |
| 冲锋衣类 | 170 | 0.22% | 99.54% |
| 健身鞋类 | 112 | 0.14% | 99.69% |
| 针织运动裤 | 83 | 0.11% | 99.79% |
| 编织衫类 | 38 | 0.05% | 99.84% |
| 休闲裤类 | 32 | 0.04% | 99.88% |
| 羽毛球鞋类 | 26 | 0.03% | 99.92% |
| 抓绒衣类 | 10 | 0.01% | 99.93% |
| 羽毛球拍 | 10 | 0.01% | 99.94% |
| 衬衫类 | 6 | 0.01% | 99.95% |
| 软壳裤 | 5 | 0.01% | 99.96% |
| 帽类 | 4 | 0.01% | 99.96% |
| 牛仔裤类 | 4 | 0.01% | 99.97% |
| 袜类 | 4 | 0.01% | 99.97% |
| 马甲类 | 4 | 0.01% | 99.98% |
| 套头衫 | 2 | 0.00% | 99.98% |
| 梭织上衣 | 2 | 0.00% | 99.98% |
| 牛仔上衣类 | 2 | 0.00% | 99.99% |
| 紧身衣 | 2 | 0.00% | 99.99% |
| 羽毛球 | 2 | 0.00% | 99.99% |
| 运动时尚鞋 | 2 | 0.00% | 99.99% |
| 针织运动上衣 | 2 | 0.00% | 100.00% |
| 其他鞋类 | 1 | 0.00% | 100.00% |
| 滑板鞋类 | 1 | 0.00% | 100.00% |
| 羽毛球线 | 1 | 0.00% | 100.00% |
track 全量分布摘要
- 不同取值数:31
- Top1:
其他,占比 29.22% - Top10 累计占比:86.84%
track 分布样例
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 其他 | 22776 | 29.22% | 29.22% |
| 篮球鞋 | 13433 | 17.23% | 46.45% |
| 经典板鞋 | 8197 | 10.52% | 56.97% |
| 缓震跑 | 7111 | 9.12% | 66.09% |
| 竞训 | 3941 | 5.06% | 71.14% |
| 老爹鞋 | 3310 | 4.25% | 75.39% |
| 短袖T恤 | 2591 | 3.32% | 78.71% |
| 薄底鞋 | 2373 | 3.04% | 81.76% |
| 夹克外套 | 2135 | 2.74% | 84.50% |
| 羽绒服 | 1829 | 2.35% | 86.84% |
| 户外鞋 | 1467 | 1.88% | 88.73% |
| 基础板鞋 | 1169 | 1.50% | 90.23% |
| 运动长裤 | 1155 | 1.48% | 91.71% |
| 舒适漫步 | 1109 | 1.42% | 93.13% |
| 复古跑 | 909 | 1.17% | 94.30% |
| 基础跑 | 735 | 0.94% | 95.24% |
| 卫衣 | 700 | 0.90% | 96.14% |
| 凉拖鞋 | 640 | 0.82% | 96.96% |
| 野外跑 | 507 | 0.65% | 97.61% |
| 潮流休闲 | 368 | 0.47% | 98.08% |
| 竞速 | 342 | 0.44% | 98.52% |
| 运动短裤 | 327 | 0.42% | 98.94% |
| 短袖POLO | 275 | 0.35% | 99.29% |
| 棉服 | 249 | 0.32% | 99.61% |
| 包 | 158 | 0.20% | 99.81% |
| 其他服装 | 60 | 0.08% | 99.89% |
| 长袖T恤 | 42 | 0.05% | 99.94% |
| 其他鞋类 | 22 | 0.03% | 99.97% |
| 其他配件 | 13 | 0.02% | 99.99% |
| 帽 | 4 | 0.01% | 99.99% |
| 袜 | 4 | 0.01% | 100.00% |
二、dim_picture_material_data_enriched 聚类分析
- 表:
data_dim.dim_picture_material_data_enriched - 总行数:6353064
- 唯一 SPU 数:55359
- 唯一素材 ID 数:0
- 聚类字段:
spu=spu,mid_cate=mid_cate,track=track_first_li_ning_bi - 聚类组合数:55360
spu分布基数:55360mid_cate分布基数:159track分布基数:31
全量聚类分布摘要
- 聚类组合总数:55360
- Top1 聚类:
spu=YKCQ274 | mid_cate=童鞋类 | track=其他,占比 0.07% - Top10 聚类累计占比:0.54%
聚类样例(前20)
| cluster_label | row_count | probability | cumulative_probability |
|---|---|---|---|
| spu=YKCQ274 | mid_cate=童鞋类 | track=其他 | 4691 |
| spu=YKNU090 | mid_cate=童鞋类 | track=其他 | 4026 |
| spu=YKAP148 | mid_cate=童鞋类 | track=其他 | 4023 |
| spu=ARPV003 | mid_cate=跑步鞋类 | track=竞训 | 3328 |
| spu=ARMV001 | mid_cate=跑步鞋类 | track=竞速 | 3259 |
| spu=ARMW004 | mid_cate=跑步鞋类 | track=竞速 | 3044 |
| spu=ARPV006 | mid_cate=跑步鞋类 | track=竞训 | 2983 |
| spu=ARMW003 | mid_cate=跑步鞋类 | track=竞速 | 2962 |
| spu=ABAT081 | mid_cate=篮球鞋类 | track=篮球鞋 | 2958 |
| spu=ABAU053 | mid_cate=篮球鞋类 | track=篮球鞋 | 2907 |
| spu=YKFR024 | mid_cate=童鞋类 | track=其他 | 2903 |
| spu=ARMV002 | mid_cate=跑步鞋类 | track=竞速 | 2802 |
| spu=ABAV007 | mid_cate=篮球鞋类 | track=篮球鞋 | 2787 |
| spu=YWDR439 | mid_cate=卫衣类 | track=其他 | 2673 |
| spu=ARMV003 | mid_cate=跑步鞋类 | track=竞速 | 2667 |
| spu=YKAP158 | mid_cate=童鞋类 | track=其他 | 2610 |
| spu=AWLU005 | mid_cate=袜类 | track=袜 | 2535 |
| spu=ARMW001 | mid_cate=跑步鞋类 | track=竞速 | 2474 |
| spu=ARBV001 | mid_cate=跑步鞋类 | track=缓震跑 | 2412 |
| spu=AGLV136 | mid_cate=运动生活鞋类 | track=薄底鞋 | 2398 |
spu 全量分布摘要
- 不同取值数:55360
- Top1:
YKCQ274,占比 0.07% - Top10 累计占比:0.54%
spu 分布样例
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| YKCQ274 | 4691 | 0.07% | 0.07% |
| YKNU090 | 4026 | 0.06% | 0.14% |
| YKAP148 | 4023 | 0.06% | 0.20% |
| ARPV003 | 3328 | 0.05% | 0.25% |
| ARMV001 | 3259 | 0.05% | 0.30% |
| ARMW004 | 3044 | 0.05% | 0.35% |
| ARPV006 | 2983 | 0.05% | 0.40% |
| ARMW003 | 2962 | 0.05% | 0.45% |
| ABAT081 | 2958 | 0.05% | 0.49% |
| ABAU053 | 2907 | 0.05% | 0.54% |
| YKFR024 | 2903 | 0.05% | 0.58% |
| ARMV002 | 2802 | 0.04% | 0.63% |
| ABAV007 | 2787 | 0.04% | 0.67% |
| YWDR439 | 2673 | 0.04% | 0.71% |
| ARMV003 | 2667 | 0.04% | 0.76% |
| YKAP158 | 2610 | 0.04% | 0.80% |
| AWLU005 | 2535 | 0.04% | 0.84% |
| ARMW001 | 2474 | 0.04% | 0.88% |
| ARBV001 | 2412 | 0.04% | 0.91% |
| AGLV136 | 2398 | 0.04% | 0.95% |
mid_cate 全量分布摘要
- 不同取值数:159
- Top1:
T恤类,占比 12.35% - Top10 累计占比:69.10%
mid_cate 分布样例
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| T恤类 | 784804 | 12.35% | 12.35% |
| 卫衣类 | 627785 | 9.88% | 22.23% |
| 运动生活鞋类 | 472832 | 7.44% | 29.68% |
| 童鞋类 | 465823 | 7.33% | 37.01% |
| 卫裤类 | 427826 | 6.73% | 43.74% |
| 跑步鞋类 | 394162 | 6.20% | 49.95% |
| 外套 | 362468 | 5.71% | 55.65% |
| 无 | 326781 | 5.14% | 60.80% |
| 运动裤类 | 281497 | 4.43% | 65.23% |
| 包类 | 245764 | 3.87% | 69.10% |
| 篮球鞋类 | 235054 | 3.70% | 72.80% |
| 羽绒服类 | 216797 | 3.41% | 76.21% |
| 运动时尚鞋 | 164601 | 2.59% | 78.80% |
| 专业比赛服类 | 164367 | 2.59% | 81.39% |
| 袜类 | 149905 | 2.36% | 83.75% |
| 帽类 | 133288 | 2.10% | 85.84% |
| 休闲裤类 | 85652 | 1.35% | 87.19% |
| Polo类 | 83027 | 1.31% | 88.50% |
| 套装类 | 63198 | 0.99% | 89.49% |
| 棉服类 | 54849 | 0.86% | 90.36% |
| 户外鞋类 | 42160 | 0.66% | 91.02% |
| 编织衫类 | 40254 | 0.63% | 91.65% |
| 紧身衣 | 39675 | 0.62% | 92.28% |
| 裙类 | 33455 | 0.53% | 92.81% |
| 针织运动裤 | 32613 | 0.51% | 93.32% |
| 衬衫类 | 28759 | 0.45% | 93.77% |
| 吊带/背心类 | 25326 | 0.40% | 94.17% |
| 羽毛球鞋类 | 22165 | 0.35% | 94.52% |
| 球类 | 19437 | 0.31% | 94.83% |
| 冲锋衣类 | 18935 | 0.30% | 95.12% |
| 羽毛球拍 | 14991 | 0.24% | 95.36% |
| 乒乓球鞋类 | 12535 | 0.20% | 95.56% |
| 运动鞋 | 12361 | 0.19% | 95.75% |
| 游泳衣类 | 11800 | 0.19% | 95.94% |
| 泳具类 | 11382 | 0.18% | 96.12% |
| 老爹鞋 | 11074 | 0.17% | 96.29% |
| 长裤 | 10602 | 0.17% | 96.46% |
| 中国李宁鞋类 | 10535 | 0.17% | 96.62% |
| 滑板鞋类 | 10505 | 0.17% | 96.79% |
| 拍类 | 10343 | 0.16% | 96.95% |
| 马甲类 | 9556 | 0.15% | 97.10% |
| 手套类 | 9172 | 0.14% | 97.25% |
| 牛仔上衣类 | 8059 | 0.13% | 97.37% |
| 针织运动上衣 | 7857 | 0.12% | 97.50% |
| 短袖衫 | 7424 | 0.12% | 97.61% |
| 足球鞋类 | 7370 | 0.12% | 97.73% |
| 牛仔裤类 | 7059 | 0.11% | 97.84% |
| 基础护具 | 6286 | 0.10% | 97.94% |
| 健身鞋类 | 6168 | 0.10% | 98.04% |
| 健步鞋 | 6122 | 0.10% | 98.13% |
| 护具类 | 5773 | 0.09% | 98.22% |
| 套头衫 | 5648 | 0.09% | 98.31% |
| 其他器材类 | 5473 | 0.09% | 98.40% |
| 羽毛球柄皮 | 5374 | 0.08% | 98.48% |
| 配饰类 | 5093 | 0.08% | 98.56% |
| 羽绒外套 | 4485 | 0.07% | 98.63% |
| 软壳衣 | 3604 | 0.06% | 98.69% |
| 羽毛球 | 3390 | 0.05% | 98.74% |
| 内裤类 | 3270 | 0.05% | 98.80% |
| 羽毛球线 | 3161 | 0.05% | 98.85% |
| 滑雪服 | 3086 | 0.05% | 98.89% |
| 其它配件 | 2991 | 0.05% | 98.94% |
| 板鞋 | 2845 | 0.04% | 98.99% |
| 冬靴/雪地靴 | 2677 | 0.04% | 99.03% |
| 浅口单鞋 | 2549 | 0.04% | 99.07% |
| 短裤 | 2533 | 0.04% | 99.11% |
| 软壳裤 | 2277 | 0.04% | 99.14% |
| 专业跑步鞋 | 2183 | 0.03% | 99.18% |
| 匹克球拍 | 2162 | 0.03% | 99.21% |
| 复古慢跑鞋 | 2156 | 0.03% | 99.25% |
| 凉鞋类 | 2068 | 0.03% | 99.28% |
| 网球鞋类 | 2049 | 0.03% | 99.31% |
| 双肩背包 | 2037 | 0.03% | 99.34% |
| 其他服装 | 1881 | 0.03% | 99.37% |
| 梭织上衣 | 1822 | 0.03% | 99.40% |
| 网球拍 | 1559 | 0.02% | 99.43% |
| 长袖衫 | 1507 | 0.02% | 99.45% |
| 泡泡鞋 | 1505 | 0.02% | 99.47% |
| 抓绒衣类 | 1416 | 0.02% | 99.50% |
| 内衣 | 1383 | 0.02% | 99.52% |
| 基础跑步鞋 | 1329 | 0.02% | 99.54% |
| 夹棉裤类 | 1283 | 0.02% | 99.56% |
| 高尔夫鞋 | 1178 | 0.02% | 99.58% |
| 其他鞋类 | 1122 | 0.02% | 99.59% |
| 短袖套装 | 1104 | 0.02% | 99.61% |
| 灯鞋 | 1066 | 0.02% | 99.63% |
| 长袖套装 | 1064 | 0.02% | 99.65% |
| 羽绒裤类 | 1039 | 0.02% | 99.66% |
| 连体衣 | 1013 | 0.02% | 99.68% |
| 洞洞鞋 | 980 | 0.02% | 99.69% |
| 高帮鞋 | 904 | 0.01% | 99.71% |
| 羽绒背心 | 898 | 0.01% | 99.72% |
| 运动上衣类 | 867 | 0.01% | 99.74% |
| 休闲鞋 | 847 | 0.01% | 99.75% |
| 推广品类 | 844 | 0.01% | 99.76% |
| 球拍配件类 | 843 | 0.01% | 99.78% |
| 围巾 | 821 | 0.01% | 99.79% |
| 紧身裤 | 820 | 0.01% | 99.80% |
| 防晒服 | 800 | 0.01% | 99.81% |
| 包头凉鞋 | 640 | 0.01% | 99.82% |
| 商务休闲鞋 | 640 | 0.01% | 99.83% |
| 半裙 | 627 | 0.01% | 99.84% |
| 学步鞋 | 553 | 0.01% | 99.85% |
| 帆布鞋 | 537 | 0.01% | 99.86% |
| 小器材 | 484 | 0.01% | 99.87% |
| 匹克球鞋类 | 474 | 0.01% | 99.88% |
| 拖鞋 | 445 | 0.01% | 99.88% |
| 网球线 | 404 | 0.01% | 99.89% |
| 其他包 | 401 | 0.01% | 99.90% |
| 运动用品 | 360 | 0.01% | 99.90% |
| 婴幼儿服装类 | 327 | 0.01% | 99.91% |
| 专业锻炼服 | 321 | 0.01% | 99.91% |
| 连衣裙 | 294 | 0.00% | 99.92% |
| 泳帽 | 274 | 0.00% | 99.92% |
| 背心 | 270 | 0.00% | 99.92% |
| 网球 | 257 | 0.00% | 99.93% |
| 运动型内衣 | 246 | 0.00% | 99.93% |
| 露趾凉鞋 | 241 | 0.00% | 99.94% |
| 运动内衣 | 237 | 0.00% | 99.94% |
| 抓绒厚外套 | 227 | 0.00% | 99.94% |
| 公仔 | 219 | 0.00% | 99.95% |
| 冲锋裤类 | 213 | 0.00% | 99.95% |
| 匹克球 | 213 | 0.00% | 99.95% |
| 棉外套 | 204 | 0.00% | 99.96% |
| 壁球拍 | 190 | 0.00% | 99.96% |
| 梭织长裤 | 188 | 0.00% | 99.96% |
| 比赛上衣 | 178 | 0.00% | 99.97% |
| 玛丽珍 | 153 | 0.00% | 99.97% |
| 水壶 | 152 | 0.00% | 99.97% |
| 棉鞋 | 144 | 0.00% | 99.97% |
| 玩偶 | 143 | 0.00% | 99.98% |
| 壁球 | 132 | 0.00% | 99.98% |
| 梭织运动套装 | 119 | 0.00% | 99.98% |
| 连身衣 | 113 | 0.00% | 99.98% |
| 马丁靴 | 112 | 0.00% | 99.98% |
| 耗材 | 107 | 0.00% | 99.98% |
| 闪钻鞋 | 106 | 0.00% | 99.99% |
| 工作鞋 | 103 | 0.00% | 99.99% |
| 泳镜 | 89 | 0.00% | 99.99% |
| 泳装 | 83 | 0.00% | 99.99% |
| 毛织/开衫 | 77 | 0.00% | 99.99% |
| 大衣类 | 65 | 0.00% | 99.99% |
| 针织衫 | 65 | 0.00% | 99.99% |
| 防撞服 | 61 | 0.00% | 99.99% |
| 速干裤类 | 53 | 0.00% | 100.00% |
| 配件套装 | 45 | 0.00% | 100.00% |
| 田径鞋类 | 44 | 0.00% | 100.00% |
| 九分裤 | 42 | 0.00% | 100.00% |
| 运动装备 | 40 | 0.00% | 100.00% |
| 其他配件 | 25 | 0.00% | 100.00% |
| 综合训练鞋 | 21 | 0.00% | 100.00% |
| 背带裙 | 14 | 0.00% | 100.00% |
| 套装(上-短袖T恤/下-运动短裤) | 10 | 0.00% | 100.00% |
| 短袖 | 10 | 0.00% | 100.00% |
| 鞋类配件类 | 10 | 0.00% | 100.00% |
| 抓绒裤类 | 9 | 0.00% | 100.00% |
| 器械类 | 8 | 0.00% | 100.00% |
| 赠品 | 4 | 0.00% | 100.00% |
| 紧身衣套装 | 2 | 0.00% | 100.00% |
track 全量分布摘要
- 不同取值数:31
- Top1:
其他,占比 65.96% - Top10 累计占比:87.03%
track 分布样例
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 其他 | 4190710 | 65.96% | 65.96% |
| 短袖T恤 | 247098 | 3.89% | 69.85% |
| 夹克外套 | 199667 | 3.14% | 73.00% |
| 运动长裤 | 195824 | 3.08% | 76.08% |
| 卫衣 | 135376 | 2.13% | 78.21% |
| 包 | 123806 | 1.95% | 80.16% |
| 篮球鞋 | 119792 | 1.89% | 82.04% |
| 其他服装 | 115070 | 1.81% | 83.85% |
| 经典板鞋 | 102790 | 1.62% | 85.47% |
| 缓震跑 | 99170 | 1.56% | 87.03% |
| 羽绒服 | 78121 | 1.23% | 88.26% |
| 袜 | 71908 | 1.13% | 89.40% |
| 运动短裤 | 65166 | 1.03% | 90.42% |
| 其他配件 | 64964 | 1.02% | 91.44% |
| 老爹鞋 | 62376 | 0.98% | 92.43% |
| 潮流休闲 | 60049 | 0.95% | 93.37% |
| 帽 | 55449 | 0.87% | 94.24% |
| 竞训 | 44757 | 0.70% | 94.95% |
| 户外鞋 | 39544 | 0.62% | 95.57% |
| 舒适漫步 | 39195 | 0.62% | 96.19% |
| 短袖POLO | 31096 | 0.49% | 96.68% |
| 其他鞋类 | 27919 | 0.44% | 97.12% |
| 竞速 | 26121 | 0.41% | 97.53% |
| 凉拖鞋 | 24613 | 0.39% | 97.91% |
| 长袖T恤 | 22051 | 0.35% | 98.26% |
| 薄底鞋 | 21557 | 0.34% | 98.60% |
| 棉服 | 19479 | 0.31% | 98.91% |
| 野外跑 | 18679 | 0.29% | 99.20% |
| 基础跑 | 17384 | 0.27% | 99.48% |
| 基础板鞋 | 17005 | 0.27% | 99.74% |
| 复古跑 | 16328 | 0.26% | 100.00% |
三、tb16_dim_product_sale_dimension 重点维度 Top20
- 表:
data_dim.tb16_dim_product_sale_dimension - 总行数:794818
- 唯一 SPU 数:112201
产品名称 Top20
- 实际字段:
产品名称
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 574271 | 72.25% | 72.25% |
| 轻量运动 | 12639 | 1.59% | 73.84% |
| 周末青年 | 7857 | 0.99% | 74.83% |
| 运动必备 | 6916 | 0.87% | 75.70% |
| 球迷风 | 5612 | 0.71% | 76.41% |
| 繁体李宁 | 4330 | 0.54% | 76.95% |
| 凉茶 | 3338 | 0.42% | 77.37% |
| 运动灵感 | 3079 | 0.39% | 77.76% |
| 机能全天候 | 2376 | 0.30% | 78.06% |
| LOGO实验室 | 2281 | 0.29% | 78.34% |
| 反伍场下 | 2260 | 0.28% | 78.63% |
| 赤兔8 PRO | 1821 | 0.23% | 78.86% |
| 羽绒服 | 1817 | 0.23% | 79.09% |
| LOGO-CORE | 1779 | 0.22% | 79.31% |
| 赤兔8 | 1662 | 0.21% | 79.52% |
| 日常跑 | 1530 | 0.19% | 79.71% |
| 赤兔7 | 1398 | 0.18% | 79.89% |
| 主题大LOGO | 1386 | 0.17% | 80.06% |
| LOGO-涂鸦 | 1313 | 0.17% | 80.23% |
| 穗岁 | 1287 | 0.16% | 80.39% |
品牌大类 Top20
- 实际字段:
品牌大类
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 服装 | 394823 | 49.67% | 49.67% |
| 鞋 | 287438 | 36.16% | 85.84% |
| 配件 | 52668 | 6.63% | 92.47% |
| 服饰 | 43328 | 5.45% | 97.92% |
| 无 | 9556 | 1.20% | 99.12% |
| 器材 | 4005 | 0.50% | 99.62% |
| 推广品 | 543 | 0.07% | 99.69% |
| 碳黑 | 193 | 0.02% | 99.72% |
| 全黑色 | 73 | 0.01% | 99.72% |
| 全黑色B BK | 68 | 0.01% | 99.73% |
| 黑色B LK | 50 | 0.01% | 99.74% |
| 赠品 | 46 | 0.01% | 99.74% |
| 碳黑0018 | 44 | 0.01% | 99.75% |
| 黑色/白色B KW | 43 | 0.01% | 99.76% |
| 黑色 | 39 | 0.00% | 99.76% |
| 棉花糖白 | 29 | 0.00% | 99.76% |
| 黑色/白色 | 26 | 0.00% | 99.77% |
| 黑色0018 | 25 | 0.00% | 99.77% |
| 乳白色 | 24 | 0.00% | 99.77% |
| 潜望镜灰 | 22 | 0.00% | 99.78% |
品牌中类 Top20
- 实际字段:
品牌中类
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| T恤类 | 137784 | 17.34% | 17.34% |
| 无 | 79184 | 9.96% | 27.30% |
| 运动生活鞋类 | 56544 | 7.11% | 34.41% |
| 卫衣类 | 53117 | 6.68% | 41.09% |
| 跑步鞋类 | 51959 | 6.54% | 47.63% |
| 童鞋类 | 47467 | 5.97% | 53.60% |
| 卫裤类 | 38804 | 4.88% | 58.49% |
| 外套 | 33637 | 4.23% | 62.72% |
| 运动裤类 | 23754 | 2.99% | 65.71% |
| 篮球鞋类 | 23544 | 2.96% | 68.67% |
| 羽绒服类 | 19057 | 2.40% | 71.07% |
| 包类 | 13736 | 1.73% | 72.79% |
| 短袖T恤 | 11537 | 1.45% | 74.25% |
| 专业比赛服类 | 10721 | 1.35% | 75.60% |
| 袜类 | 10362 | 1.30% | 76.90% |
| 运动时尚鞋 | 9746 | 1.23% | 78.13% |
| 帽类 | 7584 | 0.95% | 79.08% |
| Polo类 | 6726 | 0.85% | 79.93% |
| 低帮鞋 | 6662 | 0.84% | 80.76% |
| 户外鞋类 | 6394 | 0.80% | 81.57% |
细分赛道 Top20
- 实际字段:
抖音成人商品_细分赛道
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 506867 | 63.77% | 63.77% |
| 短袖T恤 | 64504 | 8.12% | 71.89% |
| 运动长裤 | 23559 | 2.96% | 74.85% |
| 夹克外套 | 22129 | 2.78% | 77.64% |
| 卫衣 | 17984 | 2.26% | 79.90% |
| 经典板鞋 | 15454 | 1.94% | 81.84% |
| 缓震跑 | 15418 | 1.94% | 83.78% |
| 篮球鞋 | 14518 | 1.83% | 85.61% |
| 羽绒服 | 10023 | 1.26% | 86.87% |
| 竞训 | 9612 | 1.21% | 88.08% |
| 老爹鞋 | 9407 | 1.18% | 89.26% |
| 其他服装 | 8043 | 1.01% | 90.27% |
| 包 | 7965 | 1.00% | 91.28% |
| 运动短裤 | 7343 | 0.92% | 92.20% |
| 户外鞋 | 6570 | 0.83% | 93.03% |
| 袜 | 5775 | 0.73% | 93.75% |
| 潮流休闲 | 5051 | 0.64% | 94.39% |
| 基础跑 | 4693 | 0.59% | 94.98% |
| 舒适漫步 | 4640 | 0.58% | 95.56% |
| 基础板鞋 | 4522 | 0.57% | 96.13% |
性别 Top20
- 实际字段:
性别_李宁bi
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 男 | 274108 | 34.49% | 34.49% |
| 无 | 249371 | 31.37% | 65.86% |
| 女 | 124129 | 15.62% | 81.48% |
| 中 | 106440 | 13.39% | 94.87% |
| 男童 | 27830 | 3.50% | 98.37% |
| 童 | 9179 | 1.15% | 99.53% |
| 女童 | 2324 | 0.29% | 99.82% |
| 婴幼儿 | 820 | 0.10% | 99.92% |
| 中性 | 617 | 0.08% | 100.00% |
风格 Top20
- 实际字段:
风格
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 无 | 375148 | 47.20% | 47.20% |
| 其它 | 181424 | 22.83% | 70.03% |
| 时尚 | 109307 | 13.75% | 83.78% |
| 运动 | 102137 | 12.85% | 96.63% |
| 休闲 | 15607 | 1.96% | 98.59% |
| 户外 | 10296 | 1.30% | 99.89% |
| 其他 | 899 | 0.11% | 100.00% |
适用场景 Top20
- 实际字段:
适用场景
| field_value | row_count | probability | cumulative_probability |
|---|---|---|---|
| 其它 | 393704 | 49.53% | 49.53% |
| 无 | 375148 | 47.20% | 96.73% |
| 慢跑 | 13438 | 1.69% | 98.42% |
| 竞训 | 7715 | 0.97% | 99.39% |
| 健步 | 3656 | 0.46% | 99.85% |
| 专业马拉松 | 639 | 0.08% | 99.93% |
| 越野跑 | 517 | 0.07% | 100.00% |
| 长跑 | 1 | 0.00% | 100.00% |
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import base64
import csv
import json
import os
import time
from datetime import datetime
from pathlib import Path
from typing import Any
os.environ["NO_PROXY"] = "*"
os.environ["no_proxy"] = "*"
for _key in ["HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy", "ALL_PROXY", "all_proxy"]:
os.environ.pop(_key, None)
import requests
_orig_request = requests.Session.request
def _no_proxy(self, method, url, **kwargs):
kwargs["proxies"] = {"http": "", "https": ""}
return _orig_request(self, method, url, **kwargs)
requests.Session.request = _no_proxy
try:
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.dlc.v20210125 import dlc_client, models
except ImportError as exc:
raise SystemExit(
"缺少 tencentcloud-sdk-python,请先安装:python -m pip install tencentcloud-sdk-python"
) from exc
REGION = "ap-shanghai"
SCRIPT_DIR = Path(__file__).resolve().parent
DEFAULT_OUTPUT_DIR = SCRIPT_DIR / "live-core-dimension-probe-output"
DEFAULT_TOP_N = 30
DEFAULT_SAMPLE_N = 50
FIELD_CANDIDATES: dict[str, list[str]] = {
"shop": [
"shop",
"shop_name",
"shop_nick",
"store_name",
"seller_shop_name",
"shop_id",
"erp_shop_id",
"store_id",
],
"spu": ["spu", "spu_id", "goods_spu", "item_spu"],
"author_id": ["author_id", "anchor_id", "live_author_id", "主播id", "主播ID", "authorid"],
"room_id": ["room_id", "live_room_id", "live_room", "session_id", "room_session_id", "场次id", "场次ID"],
"remark": ["remark", "remarks", "备注", "comment", "memo", "note", "description", "biz_remark", "live_remark"],
"date_key": ["dt", "ds", "date", "biz_date", "stat_date", "partition_date", "thedate"],
"datetime_key": [
"daterange",
"data_time",
"stat_time",
"event_time",
"create_time",
"update_time",
"live_time",
"start_time",
],
}
MAPPING_PAIRS: list[tuple[str, str, str]] = [
("shop_to_spu", "shop", "spu"),
("shop_to_author_id", "shop", "author_id"),
("shop_to_room_id", "shop", "room_id"),
("author_id_to_room_id", "author_id", "room_id"),
("author_id_to_spu", "author_id", "spu"),
("room_id_to_spu", "room_id", "spu"),
]
def now_tag() -> str:
return datetime.now().strftime("%Y%m%d_%H%M%S")
class DlcRunner:
def __init__(self, secret_id: str | None, secret_key: str | None, max_wait: int = 600):
if not secret_id or not secret_key:
raise SystemExit("缺少 DLC_USER / DLC_PASSWORD 环境变量。")
cred = credential.Credential(secret_id, secret_key)
http_profile = HttpProfile()
http_profile.endpoint = "dlc.tencentcloudapi.com"
client_profile = ClientProfile()
client_profile.httpProfile = http_profile
self.client = dlc_client.DlcClient(cred, REGION, client_profile)
self.max_wait = max_wait
def exec_sql(self, sql: str, db: str) -> list[list[Any]]:
preview = " ".join(sql.strip().split())[:180]
print(f"[SQL] {db}: {preview}...", flush=True)
task = models.Task()
task.SparkSQLTask = {"SQL": base64.b64encode(sql.encode("utf-8")).decode("utf-8")}
req = models.CreateTaskRequest()
req.DatabaseName = db
req.DataEngineName = "SparkSQL"
req.Task = task
resp = self.client.CreateTask(req)
task_id = json.loads(resp.to_json_string()).get("TaskId")
if not task_id:
raise RuntimeError("CreateTask 未返回 TaskId")
elapsed = 0
while elapsed < self.max_wait:
time.sleep(3)
elapsed += 3
req2 = models.DescribeTaskResultRequest()
req2.TaskId = str(task_id)
result = json.loads(self.client.DescribeTaskResult(req2).to_json_string())
task_info = result.get("TaskInfo", result)
state = task_info.get("State", "")
if state == 2:
result_set = task_info.get("ResultSet", "[]")
if isinstance(result_set, str):
try:
return json.loads(base64.b64decode(result_set).decode("utf-8"))
except Exception:
return json.loads(result_set)
return result_set or []
if state == 3:
raise RuntimeError(task_info.get("OutputMessage", "SQL failed"))
raise TimeoutError(f"SQL 执行超时,等待了 {self.max_wait}s")
def describe_table(self, db: str, table: str) -> list[str]:
req = models.DescribeTableRequest()
req.DatabaseName = db
req.TableName = table
resp = self.client.DescribeTable(req)
data = json.loads(resp.to_json_string())
table_info = data.get("Table", data)
columns = table_info.get("Columns") or []
names: list[str] = []
for item in columns:
if isinstance(item, dict) and item.get("Name"):
names.append(item["Name"])
return names
def split_table_ref(table_ref: str) -> tuple[str, str]:
if "." not in table_ref:
raise SystemExit("--table-ref 必须是 db.table 形式。")
db, table = table_ref.split(".", 1)
if not db or not table:
raise SystemExit("--table-ref 必须是 db.table 形式。")
return db, table
def normalize_expr(column_name: str, upper: bool = False) -> str:
raw = f"TRIM(CAST(`{column_name}` AS STRING))"
value_expr = f"UPPER({raw})" if upper else raw
return f"CASE WHEN `{column_name}` IS NULL OR {raw} = '' THEN NULL ELSE {value_expr} END"
def value_label_expr(field_name: str) -> str:
return f"COALESCE({field_name}, '无')"
def date_prefix_expr(column_name: str) -> str:
raw = f"TRIM(CAST(`{column_name}` AS STRING))"
return f"CASE WHEN `{column_name}` IS NULL OR {raw} = '' THEN NULL ELSE SUBSTR({raw}, 1, 10) END"
def resolve_columns(raw_columns: list[str]) -> tuple[dict[str, str | None], list[dict[str, Any]]]:
column_set = set(raw_columns)
resolved: dict[str, str | None] = {}
missing: list[dict[str, Any]] = []
for logical_name, candidates in FIELD_CANDIDATES.items():
hit = None
for candidate in candidates:
if candidate in column_set:
hit = candidate
break
resolved[logical_name] = hit
if not hit:
missing.append({"logical_name": logical_name, "candidates": candidates})
return resolved, missing
def build_base_cte(
table_fqn: str,
resolved: dict[str, str | None],
where_clause: str | None,
start_date: str | None,
end_date: str | None,
) -> str:
date_source = resolved.get("date_key") or resolved.get("datetime_key")
select_items = {
"shop": normalize_expr(resolved["shop"]) if resolved.get("shop") else "CAST(NULL AS STRING)",
"spu": normalize_expr(resolved["spu"], upper=True) if resolved.get("spu") else "CAST(NULL AS STRING)",
"author_id": normalize_expr(resolved["author_id"]) if resolved.get("author_id") else "CAST(NULL AS STRING)",
"room_id": normalize_expr(resolved["room_id"]) if resolved.get("room_id") else "CAST(NULL AS STRING)",
"remark": normalize_expr(resolved["remark"]) if resolved.get("remark") else "CAST(NULL AS STRING)",
"date_key": date_prefix_expr(date_source) if date_source else "CAST(NULL AS STRING)",
}
where_lines = [" WHERE 1 = 1"]
if where_clause:
where_lines.append(f" AND ({where_clause})")
if start_date:
if not date_source:
raise SystemExit("传了 --start-date,但表中未命中日期/时间字段候选列,请改用 --where。")
where_lines.append(f" AND {date_prefix_expr(date_source)} >= '{start_date}'")
if end_date:
if not date_source:
raise SystemExit("传了 --end-date,但表中未命中日期/时间字段候选列,请改用 --where。")
where_lines.append(f" AND {date_prefix_expr(date_source)} <= '{end_date}'")
lines = ["WITH base AS (", " SELECT"]
aliases = list(select_items.keys())
for index, alias in enumerate(aliases):
suffix = "," if index < len(aliases) - 1 else ""
lines.append(f" {select_items[alias]} AS {alias}{suffix}")
lines.append(f" FROM {table_fqn}")
lines.extend(where_lines)
lines.append(")")
return "\n".join(lines)
def build_field_profile_sql(base_cte: str, resolved: dict[str, str | None]) -> str:
fields = [
("shop", resolved.get("shop")),
("spu", resolved.get("spu")),
("author_id", resolved.get("author_id")),
("room_id", resolved.get("room_id")),
("remark", resolved.get("remark")),
("date_key", resolved.get("date_key") or resolved.get("datetime_key")),
]
unions: list[str] = []
for logical_name, physical_column in fields:
physical = physical_column or "未命中"
unions.append(
f"""
SELECT
'{logical_name}' AS logical_field,
'{physical}' AS physical_column,
COUNT(*) AS total_rows,
SUM(CASE WHEN {logical_name} IS NULL THEN 1 ELSE 0 END) AS null_rows,
ROUND(SUM(CASE WHEN {logical_name} IS NULL THEN 1 ELSE 0 END) * 1.0 / COUNT(*), 6) AS null_ratio,
COUNT(DISTINCT {logical_name}) AS distinct_values
FROM base
"""
)
return "\n".join([base_cte, "\nUNION ALL\n".join(unions), "ORDER BY logical_field"])
def build_top_distribution_sql(base_cte: str, field_name: str, limit_n: int) -> str:
label_expr = value_label_expr(field_name)
return f"""
{base_cte},
agg AS (
SELECT
{label_expr} AS field_value,
COUNT(*) AS row_count
FROM base
GROUP BY {label_expr}
)
SELECT
field_value,
row_count,
ROUND(row_count * 1.0 / SUM(row_count) OVER (), 6) AS ratio,
ROUND(SUM(row_count) OVER (ORDER BY row_count DESC, field_value ASC) * 1.0 / SUM(row_count) OVER (), 6) AS cumulative_ratio
FROM agg
ORDER BY row_count DESC, field_value ASC
LIMIT {limit_n}
"""
def build_mapping_summary_sql(base_cte: str, source_field: str, target_field: str) -> str:
return f"""
{base_cte},
pair_stats AS (
SELECT
{source_field} AS source_value,
COUNT(*) AS row_count,
COUNT(DISTINCT {target_field}) AS target_distinct_cnt
FROM base
WHERE {source_field} IS NOT NULL
AND {target_field} IS NOT NULL
GROUP BY {source_field}
)
SELECT
COUNT(*) AS source_key_count,
SUM(row_count) AS covered_rows,
ROUND(AVG(target_distinct_cnt), 4) AS avg_target_per_source,
percentile_approx(target_distinct_cnt, 0.5) AS p50_target_per_source,
percentile_approx(target_distinct_cnt, 0.9) AS p90_target_per_source,
MAX(target_distinct_cnt) AS max_target_per_source,
SUM(CASE WHEN target_distinct_cnt > 1 THEN 1 ELSE 0 END) AS multi_mapping_source_keys,
ROUND(SUM(CASE WHEN target_distinct_cnt > 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*), 6) AS multi_mapping_ratio
FROM pair_stats
"""
def build_mapping_sample_sql(base_cte: str, source_field: str, target_field: str, limit_n: int) -> str:
return f"""
{base_cte}
SELECT
{source_field} AS source_value,
{target_field} AS target_value,
COUNT(*) AS row_count
FROM base
WHERE {source_field} IS NOT NULL
AND {target_field} IS NOT NULL
GROUP BY {source_field}, {target_field}
ORDER BY row_count DESC, source_value ASC, target_value ASC
LIMIT {limit_n}
"""
def build_remark_top_sql(base_cte: str, limit_n: int) -> str:
return f"""
{base_cte}
SELECT
remark,
COUNT(*) AS row_count,
COUNT(DISTINCT shop) AS shop_cnt,
COUNT(DISTINCT spu) AS spu_cnt,
COUNT(DISTINCT author_id) AS author_cnt,
COUNT(DISTINCT room_id) AS room_cnt
FROM base
WHERE remark IS NOT NULL
GROUP BY remark
ORDER BY row_count DESC, remark ASC
LIMIT {limit_n}
"""
def build_remark_sample_sql(base_cte: str, limit_n: int) -> str:
return f"""
{base_cte}
SELECT
shop,
spu,
author_id,
room_id,
remark
FROM base
WHERE remark IS NOT NULL
ORDER BY LENGTH(remark) DESC, remark ASC
LIMIT {limit_n}
"""
def fetch_single_row(runner: DlcRunner, sql: str, db: str) -> list[Any]:
rows = runner.exec_sql(sql, db)
if not rows:
return []
return rows[0]
def write_csv(path: Path, headers: list[str], rows: list[list[Any]]) -> None:
with path.open("w", newline="", encoding="utf-8-sig") as fh:
writer = csv.writer(fh)
writer.writerow(headers)
writer.writerows(rows)
def write_json(path: Path, data: Any) -> None:
path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
def build_markdown_summary(
table_ref: str,
resolved: dict[str, str | None],
missing: list[dict[str, Any]],
field_profile_rows: list[list[Any]],
mapping_summaries: list[dict[str, Any]],
output_dir: Path,
) -> str:
lines = [
f"# 直播核心维度探针报告",
"",
f"- 目标表: `{table_ref}`",
f"- 输出目录: `{output_dir}`",
"",
"## 命中字段",
]
for logical_name in ["shop", "spu", "author_id", "room_id", "remark", "date_key", "datetime_key"]:
lines.append(f"- `{logical_name}` -> `{resolved.get(logical_name) or '未命中'}`")
if missing:
lines.append("")
lines.append("## 未命中候选")
for item in missing:
lines.append(f"- `{item['logical_name']}`: {', '.join(item['candidates'])}")
lines.append("")
lines.append("## 字段概况")
lines.append("| logical_field | physical_column | total_rows | null_rows | null_ratio | distinct_values |")
lines.append("| --- | --- | ---: | ---: | ---: | ---: |")
for row in field_profile_rows:
lines.append(f"| {row[0]} | {row[1]} | {row[2]} | {row[3]} | {row[4]} | {row[5]} |")
if mapping_summaries:
lines.append("")
lines.append("## 映射摘要")
lines.append("| mapping_name | source_key_count | covered_rows | avg_target_per_source | p50 | p90 | max | multi_mapping_ratio |")
lines.append("| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |")
for item in mapping_summaries:
lines.append(
f"| {item['mapping_name']} | {item['source_key_count']} | {item['covered_rows']} | "
f"{item['avg_target_per_source']} | {item['p50_target_per_source']} | {item['p90_target_per_source']} | "
f"{item['max_target_per_source']} | {item['multi_mapping_ratio']} |"
)
return "\n".join(lines) + "\n"
def main() -> None:
parser = argparse.ArgumentParser(description="采样直播表中的备注与核心维度分布。")
parser.add_argument("--table-ref", required=True, help="目标表,格式 db.table")
parser.add_argument("--where", default=None, help="附加过滤条件,例如 shop = '李宁官方网店'")
parser.add_argument("--start-date", default=None, help="开始日期,格式 YYYY-MM-DD")
parser.add_argument("--end-date", default=None, help="结束日期,格式 YYYY-MM-DD")
parser.add_argument("--top-n", type=int, default=DEFAULT_TOP_N, help="分布 Top N")
parser.add_argument("--sample-n", type=int, default=DEFAULT_SAMPLE_N, help="备注/映射样例条数")
parser.add_argument("--max-wait", type=int, default=600, help="单条 SQL 最长等待秒数")
parser.add_argument("--output-dir", default=str(DEFAULT_OUTPUT_DIR), help="输出目录")
args = parser.parse_args()
db, table = split_table_ref(args.table_ref)
table_fqn = f"{db}.{table}"
output_dir = Path(args.output_dir).resolve() / f"{table.replace('.', '_')}_{now_tag()}"
output_dir.mkdir(parents=True, exist_ok=True)
runner = DlcRunner(os.getenv("DLC_USER"), os.getenv("DLC_PASSWORD"), max_wait=args.max_wait)
raw_columns = runner.describe_table(db, table)
resolved, missing = resolve_columns(raw_columns)
base_cte = build_base_cte(table_fqn, resolved, args.where, args.start_date, args.end_date)
field_profile_rows = runner.exec_sql(build_field_profile_sql(base_cte, resolved), db)
write_csv(
output_dir / "field_profile.csv",
["logical_field", "physical_column", "total_rows", "null_rows", "null_ratio", "distinct_values"],
field_profile_rows,
)
top_distribution_summary: dict[str, list[list[Any]]] = {}
for field_name in ["shop", "spu", "author_id", "room_id"]:
rows = runner.exec_sql(build_top_distribution_sql(base_cte, field_name, args.top_n), db)
top_distribution_summary[field_name] = rows
write_csv(
output_dir / f"top_distribution_{field_name}.csv",
["field_value", "row_count", "ratio", "cumulative_ratio"],
rows,
)
mapping_summaries: list[dict[str, Any]] = []
mapping_samples: dict[str, list[list[Any]]] = {}
for mapping_name, source_field, target_field in MAPPING_PAIRS:
if not resolved.get(source_field) or not resolved.get(target_field):
continue
summary_row = fetch_single_row(runner, build_mapping_summary_sql(base_cte, source_field, target_field), db)
if summary_row:
mapping_summaries.append(
{
"mapping_name": mapping_name,
"source_field": source_field,
"target_field": target_field,
"source_key_count": summary_row[0],
"covered_rows": summary_row[1],
"avg_target_per_source": summary_row[2],
"p50_target_per_source": summary_row[3],
"p90_target_per_source": summary_row[4],
"max_target_per_source": summary_row[5],
"multi_mapping_source_keys": summary_row[6],
"multi_mapping_ratio": summary_row[7],
}
)
sample_rows = runner.exec_sql(build_mapping_sample_sql(base_cte, source_field, target_field, args.sample_n), db)
mapping_samples[mapping_name] = sample_rows
write_csv(
output_dir / f"mapping_sample_{mapping_name}.csv",
["source_value", "target_value", "row_count"],
sample_rows,
)
remark_top_rows: list[list[Any]] = []
remark_sample_rows: list[list[Any]] = []
if resolved.get("remark"):
remark_top_rows = runner.exec_sql(build_remark_top_sql(base_cte, args.top_n), db)
remark_sample_rows = runner.exec_sql(build_remark_sample_sql(base_cte, args.sample_n), db)
write_csv(
output_dir / "remark_top_distribution.csv",
["remark", "row_count", "shop_cnt", "spu_cnt", "author_cnt", "room_cnt"],
remark_top_rows,
)
write_csv(
output_dir / "remark_samples.csv",
["shop", "spu", "author_id", "room_id", "remark"],
remark_sample_rows,
)
summary = {
"table_ref": args.table_ref,
"where": args.where,
"start_date": args.start_date,
"end_date": args.end_date,
"resolved_columns": resolved,
"missing_candidates": missing,
"raw_columns": raw_columns,
"field_profile": field_profile_rows,
"top_distributions": top_distribution_summary,
"mapping_summaries": mapping_summaries,
"remark_top_distribution": remark_top_rows,
"remark_samples": remark_sample_rows,
"output_dir": str(output_dir),
}
write_json(output_dir / "summary.json", summary)
markdown = build_markdown_summary(args.table_ref, resolved, missing, field_profile_rows, mapping_summaries, output_dir)
(output_dir / "summary.md").write_text(markdown, encoding="utf-8")
print(f"输出目录: {output_dir}")
print("已生成: field_profile.csv, top_distribution_*.csv, mapping_sample_*.csv, summary.json, summary.md")
if resolved.get("remark"):
print("已生成: remark_top_distribution.csv, remark_samples.csv")
else:
print("备注字段未命中,跳过备注采样。")
if __name__ == "__main__":
main()