DATABASE_SETUP.md
4.72 KB
数据库字段配置说明
问题说明
如果运行时遇到类似 Unknown column 'xxx' 的错误,说明数据库表结构与代码中使用的字段名不匹配。
已适配的基础字段
当前代码已经适配了以下基础字段(参考 item_sim.py):
sensors_events 表
anonymous_id- 用户IDitem_id- 商品IDevent- 事件类型create_time- 创建时间platform- 平台(可选)country- 国家(可选)customer_type- 客户类型(可选)
prd_goods_sku 表
id- 商品IDname- 商品名称create_time- 创建时间(用于判断新品)
可选字段配置
如果您的数据库表包含以下字段,可以在SQL查询中添加它们以支持更多维度:
分类字段(可选)
category_level1_id- 一级分类IDcategory_level2_id- 二级分类IDcategory_level3_id- 三级分类ID
如何添加分类字段支持
如果您的数据库有分类字段,可以按以下步骤启用:
步骤1: 修改 SQL 查询
编辑 scripts/interest_aggregation.py,找到 SQL 查询部分,添加分类字段:
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 函数中,字段检查已经做好了,如果字段存在会自动使用:
# 维度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
这段代码会自动检测字段是否存在,如果存在就使用,不存在就跳过。
查看实际表结构
运行以下命令查看您的数据库表结构:
# 创建一个简单的脚本查看表结构
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_timesensors_events有字段:uid,goods_id,action,time
则需要修改SQL为:
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_iditem_idevent/event_typecreate_timename(商品名称)
兴趣点聚合至少需要:
- 以上i2i的字段
- 至少一个维度字段(如
platform或country)
测试连接
修改后,运行测试脚本验证:
cd /home/tw/recommendation/offline_tasks
python3 test_connection.py
获取帮助
如果仍有问题,请:
- 查看日志文件:
logs/run_all_*.log - 运行单个脚本测试,便于调试
- 使用
--help参数查看命令行选项
python3 scripts/i2i_swing.py --help
python3 scripts/interest_aggregation.py --help