DATABASE_SETUP.md 4.72 KB

数据库字段配置说明

问题说明

如果运行时遇到类似 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 查询部分,添加分类字段:

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_time
  • sensors_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_id
  • item_id
  • event / event_type
  • create_time
  • name (商品名称)

兴趣点聚合至少需要:

  • 以上i2i的字段
  • 至少一个维度字段(如 platformcountry

测试连接

修改后,运行测试脚本验证:

cd /home/tw/recommendation/offline_tasks
python3 test_connection.py

获取帮助

如果仍有问题,请:

  1. 查看日志文件:logs/run_all_*.log
  2. 运行单个脚本测试,便于调试
  3. 使用 --help 参数查看命令行选项
python3 scripts/i2i_swing.py --help
python3 scripts/interest_aggregation.py --help