# 数据库字段配置说明 ## 问题说明 如果运行时遇到类似 `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 ```