Blame view

offline_tasks/doc/数据库配置说明.md 4.72 KB
12118125   tangwang   offline tasks: me...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  # 数据库字段配置说明
  
  ## 问题说明
  
  如果运行时遇到类似 `Unknown column 'xxx'` 的错误,说明数据库表结构与代码中使用的字段名不匹配。
  
  ## 已适配的基础字段
  
  当前代码已经适配了以下基础字段(参考 `item_sim.py`):
  
  ### sensors_events 表
  - `anonymous_id` - 用户ID
  - `item_id` - 商品ID  
  - `event` - 事件类型
  - `create_time` - 创建时间
  - `platform` - 平台(可选)
  - `country` - 国家(可选)
  - `customer_type` - 客户类型(可选)
  
  ### prd_goods_sku 表
  - `id` - 商品ID
  - `name` - 商品名称
  - `create_time` - 创建时间(用于判断新品)
  
  ## 可选字段配置
  
  如果您的数据库表包含以下字段,可以在SQL查询中添加它们以支持更多维度:
  
  ### 分类字段(可选)
  - `category_level1_id` - 一级分类ID
  - `category_level2_id` - 二级分类ID
  - `category_level3_id` - 三级分类ID
  
  ## 如何添加分类字段支持
  
  如果您的数据库有分类字段,可以按以下步骤启用:
  
  ### 步骤1: 修改 SQL 查询
  
  编辑 `scripts/interest_aggregation.py`,找到 SQL 查询部分,添加分类字段:
  
  ```python
  sql_query = f"""
  SELECT 
      se.anonymous_id AS user_id,
      se.item_id,
      se.event AS event_type,
      se.create_time,
      pgs.name AS item_name,
      pgs.create_time AS item_create_time,
      pgs.category_level2_id,    # 添加这一行
      pgs.category_level3_id,    # 添加这一行
      se.platform,
      se.country,
      se.customer_type
  FROM 
      sensors_events se
  LEFT JOIN prd_goods_sku pgs ON se.item_id = pgs.id
  ...
  """
  ```
  
  ### 步骤2: 修改聚合逻辑
  
  `aggregate_by_dimensions` 函数中,字段检查已经做好了,如果字段存在会自动使用:
  
  ```python
  # 维度4: 二级分类 (category_level2) - 如果字段存在
  if 'category_level2_id' in row and pd.notna(row.get('category_level2_id')):
      key = f"category_level2:{row['category_level2_id']}"
      aggregations[key][item_id] += weight
  ```
  
  这段代码会自动检测字段是否存在,如果存在就使用,不存在就跳过。
  
  ## 查看实际表结构
  
  运行以下命令查看您的数据库表结构:
  
  ```python
  # 创建一个简单的脚本查看表结构
  import pandas as pd
  from db_service import create_db_connection
  from offline_tasks.config.offline_config import DB_CONFIG
  
  engine = create_db_connection(
      DB_CONFIG['host'],
      DB_CONFIG['port'],
      DB_CONFIG['database'],
      DB_CONFIG['username'],
      DB_CONFIG['password']
  )
  
  # 查看 prd_goods_sku 表结构
  df = pd.read_sql("SELECT * FROM prd_goods_sku LIMIT 1", engine)
  print("prd_goods_sku 字段列表:")
  for col in df.columns:
      print(f"  - {col}")
  
  # 查看 sensors_events 表结构  
  df = pd.read_sql("SELECT * FROM sensors_events LIMIT 1", engine)
  print("\nsensors_events 字段列表:")
  for col in df.columns:
      print(f"  - {col}")
  ```
  
  ## 常见字段名映射
  
  如果您的数据库使用不同的字段名,需要在SQL查询中做映射:
  
  | 代码中的字段 | 可能的实际字段名 | 修改方式 |
  |-------------|----------------|---------|
  | `category_level2_id` | `cat2_id`, `category2`, `second_category` | `pgs.cat2_id AS category_level2_id` |
  | `category_level3_id` | `cat3_id`, `category3`, `third_category` | `pgs.cat3_id AS category_level3_id` |
  | `anonymous_id` | `user_id`, `uid`, `visitor_id` | `se.user_id AS anonymous_id` |
  | `customer_type` | `client_type`, `buyer_type` | `se.client_type AS customer_type` |
  
  ## 完整示例
  
  假设您的表结构是:
  - `prd_goods_sku` 有字段:`id`, `title`, `cat2`, `cat3`, `add_time`
  - `sensors_events` 有字段:`uid`, `goods_id`, `action`, `time`
  
  则需要修改SQL为:
  
  ```python
  sql_query = f"""
  SELECT 
      se.uid AS user_id,
      se.goods_id AS item_id,
      se.action AS event_type,
      se.time AS create_time,
      pgs.title AS item_name,
      pgs.add_time AS item_create_time,
      pgs.cat2 AS category_level2_id,
      pgs.cat3 AS category_level3_id
  FROM 
      sensors_events se
  LEFT JOIN prd_goods_sku pgs ON se.goods_id = pgs.id
  ...
  """
  ```
  
  ## 最小化配置
  
  如果只想先测试基本功能,可以只使用最基础的字段:
  
  ### i2i 算法只需要:
  - `anonymous_id` / `user_id`
  - `item_id`  
  - `event` / `event_type`
  - `create_time`
  - `name` (商品名称)
  
  ### 兴趣点聚合至少需要:
  - 以上i2i的字段
  - 至少一个维度字段(如 `platform` 或 `country`
  
  ## 测试连接
  
  修改后,运行测试脚本验证:
  
  ```bash
  cd /home/tw/recommendation/offline_tasks
  python3 test_connection.py
  ```
  
  ## 获取帮助
  
  如果仍有问题,请:
  1. 查看日志文件:`logs/run_all_*.log`
  2. 运行单个脚本测试,便于调试
  3. 使用 `--help` 参数查看命令行选项
  
  ```bash
  python3 scripts/i2i_swing.py --help
  python3 scripts/interest_aggregation.py --help
  ```