Spark SQL练习2-电商用户行为分析

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: “**商城”电商平台需基于用户行为数据开展深度分析:一是计算用户活跃度趋势(含活跃天数、变化率及四类用户分层);二是构建RFM价值分层模型,量化R/F/M得分并划分高价值、潜力等四类用户;三是识别流失风险用户,分析其浏览时长变化与偏好品类。支撑精细化运营与精准营销。

背景

随着**商城电商平台业务的持续扩张,用户行为数据呈现出更加复杂和多样化的特征。在已完成基础购买行为分析的基础上,平台需要进一步挖掘用户行为背后的深层规律,包括用户活跃度变化趋势、商品关联购买模式、高价值用户识别以及流失风险预警等。这些深度分析将为精细化运营、个性化推荐和风险管控提供强有力的数据支撑。

题目

**商城电商平台需要基于历史用户行为数据,进行更深层次的用户行为洞察:

  1. 计算用户活跃度趋势指标
  2. 构建用户价值分层模型
  3. 分析用户流失风险特征

数据模型设计

用户信息表 (dim_users)

字段名

类型

说明

user_id

BIGINT

用户唯一标识ID

user_name

STRING

用户昵称

register_date

DATE

用户注册日期

city

STRING

用户常驻城市

membership_level

STRING

会员等级:普通/白银/黄金/钻石

is_vip

BOOLEAN

是否VIP用户


订单事实表 (fact_orders)

字段名

类型

说明

order_id

BIGINT

订单唯一标识ID

user_id

BIGINT

用户ID,关联dim_users表

order_date

DATE

订单创建日期

order_time

TIMESTAMP

订单创建时间戳

total_amount

DOUBLE

订单实付金额

discount_amount

DOUBLE

优惠折扣金额

status

STRING

订单状态:paid/refunded/cancelled

payment_method

STRING

支付方式:alipay/wechat/credit/card

channel

STRING

下单渠道:app/web/miniprogram


订单明细表 (fact_order_items)

字段名

类型

说明

order_id

BIGINT

订单ID,关联fact_orders表

product_id

BIGINT

商品唯一标识ID

product_name

STRING

商品名称

category

STRING

商品一级类目

sub_category

STRING

商品二级类目

quantity

INT

购买数量

unit_price

DOUBLE

商品单价

item_amount

DOUBLE

商品小计金额


用户行为日志表 (fact_user_behavior)

字段名

类型

说明

user_id

BIGINT

用户ID

behavior_date

DATE

行为发生日期

behavior_time

TIMESTAMP

行为发生时间戳

behavior_type

STRING

行为类型:view/cart/favorite/buy

product_id

BIGINT

商品ID

category

STRING

商品一级类目

duration_seconds

INT

停留时长(秒),仅view行为有值

device_type

STRING

设备类型:mobile/pc/tablet

page_source

STRING

来源页面:home/search/recommend/detail


统计需求

  1. 计算用户活跃度趋势指标(以2026-02-19为基准)
  • 统计最近30天内每个用户的活跃天数
  • 计算用户最近7天与之前23天的活跃天数比值(活跃度变化率)
  • 别活跃用户(最近7天活跃天数≥4天)、普通用户(最近7天活跃天数>=0 AND < 4)、沉默用户(最近7天无活跃但之前23天有活跃)、流失用户(最近30天无活跃)

查询结果按活跃天数降序排序,相等则按用户id升序

SELECT
    t.user_id                       AS user_id
  , u.user_name                     AS user_name
  , COUNT(DISTINCT t.behavior_date) AS active_days
  , ROUND(COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                            t.behavior_date, NULL)) / COUNT(DISTINCT IF(
        t.behavior_date < DATE_SUB('2026-02-19', 7), t.behavior_date, NULL)) *
          100, 2)                   AS active_days_change_rate
  , CASE
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) >= 4 THEN '活跃用户'
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) BETWEEN 0 AND 3
            THEN '普通用户'
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) = 0 AND
             COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) > 0 THEN '沉默用户'
        WHEN COUNT(DISTINCT t.behavior_date) = 0 THEN '流失用户'
        END                         AS user_type
FROM
    dataspire_catalog.db_dev.fact_user_behavior t
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.behavior_date >= DATE_SUB('2026-02-19', 30)
GROUP BY
    t.user_id, u.user_name
ORDER BY
    active_days DESC, user_id
LIMIT 10
;

预期输出:


  1. 构建用户价值分层模型(以2026-02-19为基准)
  • 基于RFM模型计算每个用户的价值得分:
  • R(Recency):最近一次购买距离当前的天数,分值1-5分(越近分数越高)
  • 5分:天数最小的前 20% 用户(最近刚买过)
  • 4分:天数在 20%-40% 之间的用户
  • 3分:天数在 40%-60% 之间的用户
  • 2分:天数在 60%-80% 之间的用户
  • 1分:天数最大的后 20% 用户(很久没买了)
  • F(Frequency):购买频次,分值1-5分(越高分数越高)
  • 5分:频次最高的前 20% 用户
  • 4分:频次在 20%-40% 之间的用户
  • 3分:频次在 40%-60% 之间的用户
  • 2分:频次在 60%-80% 之间的用户
  • 1分:频次最低的后 20% 用户
  • M(Monetary):消费总金额,分值1-5分(越高分数越高)
  • 5分:金额最高的前 20% 用户
  • 4分:金额在 20%-40% 之间的用户
  • 3分:金额在 40%-60% 之间的用户
  • 2分:金额在 60%-80% 之间的用户
  • 1分:金额最低的后 20% 用户
  • 综合得分 = R * 0.3 + F * 0.3 + M * 0.4
  • 根据综合得分将用户分为:高价值用户(前20%)、潜力用户(20%-50%)、一般用户(50%-80%)、低价值用户(后20%)

查询结果按综合得分降序排序,相等则按用户id升序,分值保留两位小数

WITH tab AS
(
SELECT
    t.user_id                                 AS user_id
  , u.user_name                               AS user_name
  , DATEDIFF('2025-02-19', MAX(t.order_date)) AS date_diff
  , COUNT(DISTINCT t.order_id)                AS order_cnt
  , SUM(i.item_amount)                        AS item_amt
FROM
    dataspire_catalog.db_dev.fact_orders t
    LEFT JOIN dataspire_catalog.db_dev.fact_order_items i
              ON t.order_id = i.order_id
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.status = 'paid'
GROUP BY
    t.user_id, u.user_name
),
tab1 AS
(
SELECT
    tab.user_id   AS user_id
  , tab.user_name AS user_name
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.2 AND 0.4 THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.4 AND 0.6 THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.6 AND 0.8 THEN 2
        ELSE 1
        END       AS date_diff_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.2 AND 0.4
            THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.4 AND 0.6
            THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.6 AND 0.8
            THEN 2
        ELSE 1
        END       AS order_cnt_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.2 AND 0.4
            THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.4 AND 0.6
            THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.6 AND 0.8
            THEN 2
        ELSE 1
        END       AS item_amt_rank
FROM
    tab
WHERE
    1 = 1
)
SELECT
    tab1.user_id                       AS user_id
  , tab1.user_name                     AS user_name
  , ROUND(tab1.date_diff_rank * 0.3 + tab1.order_cnt_rank * 0.3 +
          tab1.item_amt_rank * 0.4, 2) AS final_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank * 0.4 DESC) <= 0.2
            THEN '高价值用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.2 AND 0.5
            THEN '潜力用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.5 AND 0.8
            THEN '一般用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.8 AND 1
            THEN '低价值用户'
        ELSE '低价值用户'
        END
FROM
    tab1
WHERE
    1 = 1
ORDER BY
    final_rank DESC, tab1.user_id
;

预期输出:


  1. 分析用户流失风险特征
  • 识别有流失风险的用户
  • 我们需要对比两个时间段:
  • 基准期:例如 31-60 天前(用来定义用户的“正常活跃度”)。
  • 观察期:最近 30 天(用来定义用户的“当前活跃度”)。
  • 筛选条件:
  • 在 fact_user_behavior 表中发生任意行为(behavior_type IN ('view', 'cart', 'favorite', 'buy'))的天数。
  • 条件:观察期活跃天数 < 基准期活跃天数 * 0.5且最近30天无购买行为
  • 分析流失风险用户的行为特征:
  • 平均浏览时长变化率: (基准期平均每日浏览时长 - 观察期平均每日浏览时长) / 基准期平均每日浏览时长。
  • 主要浏览品类:统计观察期内用户浏览次数最多的 category(一级类目)。

查询结果平均浏览时长变化率降序排序

WITH tab AS
(
SELECT
    t.user_id                        AS user_id -- 用户id
  , u.user_name                      AS user_name -- 用户名
  , t.category                       AS category -- 商品一级类目
  , IF(COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 30),
                         t.duration_seconds, NULL)) = 0, 0,
       SUM(IF(t.behavior_date >= DATE_SUB('2026-02-19', 30), t.duration_seconds,
              0)) / COUNT(DISTINCT
                          IF(t.behavior_date >= DATE_SUB('2026-02-19', 30),
                             t.duration_seconds,
                             NULL))) AS avg_dur_seconds_obs -- 观察期平均每日浏览时长
  , IF(COUNT(DISTINCT IF(t.behavior_date < DATE_SUB('2026-02-19', 30),
                         t.duration_seconds, NULL)) = 0, 0,
       SUM(IF(t.behavior_date < DATE_SUB('2026-02-19', 30), t.duration_seconds,
              0)) / COUNT(DISTINCT
                          IF(t.behavior_date < DATE_SUB('2026-02-19', 30),
                             t.duration_seconds,
                             NULL))) AS avg_dur_seconds_bench -- 基期期平均每日浏览时长
  , COUNT(1)                         AS view_cnt -- 浏览次数
FROM
    dataspire_catalog.db_dev.fact_user_behavior t
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.behavior_date >= DATE_SUB('2026-02-19', 60)
GROUP BY
    t.user_id, u.user_name, t.category
HAVING
    -- 观察期活跃天数 < 基准期活跃天数 * 0.5
    IF(COUNT(DISTINCT IF(
            t.behavior_type IN ('view', 'cart', 'favorite', 'buy') AND
            t.behavior_date >= DATE_SUB('2026-02-19', 30), t.behavior_date,
            NULL))
           < COUNT(DISTINCT IF(
                t.behavior_type IN ('view', 'cart', 'favorite', 'buy') AND
                t.behavior_date < DATE_SUB('2026-02-19', 30), t.behavior_date,
                NULL)) * 0.5, 1, 0) = 1
),
tab1 AS
(
SELECT
     tab.user_id                AS user_id -- 用户id
   , tab.user_name              AS user_name -- 用户名
   , tab.category               AS category -- 商品一级类目
   , ROW_NUMBER() OVER (PARTITION BY tab.user_id
        ORDER BY view_cnt DESC) AS order_rank -- 排序
   , tab.avg_dur_seconds_obs    AS avg_dur_seconds_obs -- 观察期平均每日浏览时长
   , tab.avg_dur_seconds_bench  AS avg_dur_seconds_bench -- 基期期平均每日浏览时长
FROM
    tab
WHERE
    1 = 1
)
SELECT
    tab1.user_id                               AS user_id -- 用户id
  , tab1.user_name                             AS user_name -- 用户名
  , tab1.category                              AS category -- 用户浏览次数最多的 category
  , ROUND((tab1.avg_dur_seconds_bench - tab1.avg_dur_seconds_obs) /
          tab1.avg_dur_seconds_bench * 100,
          2)                                   AS avg_dur_seconds_diff -- 平均浏览时长变化率
FROM
    tab1
        -- 过滤掉最近30天内有消费的用户
    INNER JOIN (SELECT DISTINCT
                    t.user_id AS user_id
                FROM
                    dataspire_catalog.db_dev.fact_orders t
                WHERE
                    1 = 1 AND t.order_date < DATE_SUB('2026-02-19', 30)) o
               ON tab1.user_id = o.user_id
WHERE
    -- 取浏览次数最多的一级类目
    1 = 1 AND tab1.order_rank = 1
ORDER BY
    avg_dur_seconds_diff DESC, user_id
LIMIT 10
;

预期输出:


DDL

DROP TABLE IF EXISTS dataspire_catalog.db_dev.fact_user_behavior PURGE;
CREATE TABLE IF NOT EXISTS dataspire_catalog.db_dev.fact_user_behavior
(
    user_id          STRING COMMENT '用户ID',
    behavior_date    STRING COMMENT '行为发生日期',
    behavior_time    STRING COMMENT '行为发生时间戳',
    behavior_type    STRING COMMENT '行为类型:view/cart/favorite/buy',
    product_id       STRING COMMENT '商品ID',
    category         STRING COMMENT '商品一级类目',
    duration_seconds STRING COMMENT '停留时长(秒),仅view行为有值',
    device_type      STRING COMMENT '设备类型:mobile/pc/tablet',
    page_source      STRING COMMENT '来源页面:home/search/recommend/detail'
)
USING iceberg
TBLPROPERTIES (
    'comment' = '用户行为日志表'
)
;
-- ==================== 插入用户行为数据 ====================
INSERT INTO dataspire_catalog.db_dev.fact_user_behavior VALUES
-- ========== 用户10001(活跃用户 - 最近30天有多次活跃)==========
(10001, '2026-02-18', '2026-02-18 10:30:00', 'view', 5001, '手机数码', 120, 'mobile', 'home'),
(10001, '2026-02-18', '2026-02-18 10:35:00', 'view', 5002, '手机数码', 85, 'mobile', 'search'),
(10001, '2026-02-18', '2026-02-18 10:40:00', 'cart', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-02-18', '2026-02-18 10:45:00', 'buy', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-02-17', '2026-02-17 14:20:00', 'view', 5004, '电脑办公', 200, 'mobile', 'recommend'),
(10001, '2026-02-17', '2026-02-17 14:25:00', 'favorite', 5004, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-02-16', '2026-02-16 09:15:00', 'view', 5005, '电脑办公', 150, 'web', 'home'),
(10001, '2026-02-16', '2026-02-16 09:20:00', 'cart', 5005, '电脑办公', 0, 'web', 'detail'),
(10001, '2026-02-15', '2026-02-15 16:00:00', 'view', 5006, '电脑办公', 180, 'mobile', 'search'),
(10001, '2026-02-15', '2026-02-15 16:10:00', 'buy', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-02-14', '2026-02-14 11:30:00', 'view', 5016, '家用电器', 90, 'mobile', 'recommend'),
(10001, '2026-02-13', '2026-02-13 10:00:00', 'view', 5017, '家用电器', 110, 'mobile', 'home'),
(10001, '2026-02-13', '2026-02-13 10:05:00', 'cart', 5017, '家用电器', 0, 'mobile', 'detail'),
(10001, '2026-02-12', '2026-02-12 15:30:00', 'view', 5025, '美妆个护', 75, 'mobile', 'search'),
(10001, '2026-02-10', '2026-02-10 09:00:00', 'view', 5010, '服饰鞋包', 95, 'web', 'home'),
(10001, '2026-02-08', '2026-02-08 14:00:00', 'view', 5012, '智能穿戴', 130, 'mobile', 'recommend'),
(10001, '2026-02-08', '2026-02-08 14:10:00', 'buy', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10001, '2026-02-05', '2026-02-05 11:00:00', 'view', 5020, '手机数码', 160, 'mobile', 'search'),
(10001, '2026-02-01', '2026-02-01 10:30:00', 'view', 5001, '手机数码', 100, 'mobile', 'home'),
(10001, '2026-02-01', '2026-02-01 10:35:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-01-28', '2026-01-28 16:00:00', 'view', 5018, '家用电器', 140, 'mobile', 'recommend'),
(10001, '2026-01-25', '2026-01-25 09:30:00', 'view', 5003, '手机数码', 80, 'web', 'search'),
(10001, '2026-01-25', '2026-01-25 09:35:00', 'buy', 5003, '手机数码', 0, 'web', 'detail'),
(10001, '2026-01-20', '2026-01-20 14:00:00', 'view', 5019, '服饰鞋包', 105, 'mobile', 'home'),
(10001, '2026-01-15', '2026-01-15 11:00:00', 'view', 5007, '电脑办公', 175, 'mobile', 'recommend'),
(10001, '2026-01-15', '2026-01-15 11:10:00', 'cart', 5007, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-01-15', '2026-01-15 11:15:00', 'buy', 5007, '电脑办公', 0, 'mobile', 'detail'),
-- ========== 用户10002(高价值用户 - 购买金额高)==========
(10002, '2026-02-19', '2026-02-19 10:00:00', 'view', 5009, '家用电器', 250, 'mobile', 'home'),
(10002, '2026-02-19', '2026-02-19 10:10:00', 'cart', 5009, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-19', '2026-02-19 10:15:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-17', '2026-02-17 11:00:00', 'view', 5022, '电脑办公', 300, 'web', 'search'),
(10002, '2026-02-17', '2026-02-17 11:15:00', 'favorite', 5022, '电脑办公', 0, 'web', 'detail'),
(10002, '2026-02-16', '2026-02-16 14:30:00', 'view', 5020, '手机数码', 220, 'mobile', 'recommend'),
(10002, '2026-02-16', '2026-02-16 14:40:00', 'buy', 5020, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-02-14', '2026-02-14 09:00:00', 'view', 5024, '家用电器', 280, 'mobile', 'home'),
(10002, '2026-02-14', '2026-02-14 09:20:00', 'cart', 5024, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-14', '2026-02-14 09:30:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-10', '2026-02-10 15:00:00', 'view', 5021, '手机数码', 190, 'mobile', 'search'),
(10002, '2026-02-10', '2026-02-10 15:10:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-02-05', '2026-02-05 10:30:00', 'view', 5006, '电脑办公', 260, 'web', 'recommend'),
(10002, '2026-02-05', '2026-02-05 10:45:00', 'buy', 5006, '电脑办公', 0, 'web', 'detail'),
(10002, '2026-02-01', '2026-02-01 11:00:00', 'view', 5008, '家居生活', 240, 'mobile', 'home'),
(10002, '2026-02-01', '2026-02-01 11:15:00', 'cart', 5008, '家居生活', 0, 'mobile', 'detail'),
(10002, '2026-02-01', '2026-02-01 11:20:00', 'buy', 5008, '家居生活', 0, 'mobile', 'detail'),
(10002, '2026-01-28', '2026-01-28 14:00:00', 'view', 5023, '手机数码', 210, 'mobile', 'search'),
(10002, '2026-01-28', '2026-01-28 14:15:00', 'buy', 5023, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-01-20', '2026-01-20 09:30:00', 'view', 5017, '家用电器', 185, 'mobile', 'recommend'),
(10002, '2026-01-20', '2026-01-20 09:40:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
-- ========== 用户10003(流失风险用户 - 最近30天活跃度下降)==========
(10003, '2026-01-15', '2026-01-15 08:00:00', 'view', 5010, '服饰鞋包', 90, 'web', 'home'),
(10003, '2026-01-15', '2026-01-15 08:10:00', 'cart', 5010, '服饰鞋包', 0, 'web', 'detail'),
(10003, '2026-01-10', '2026-01-10 19:30:00', 'view', 5011, '服饰鞋包', 75, 'mobile', 'search'),
(10003, '2026-01-10', '2026-01-10 19:35:00', 'favorite', 5011, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2026-01-05', '2026-01-05 10:00:00', 'view', 5014, '手机数码', 100, 'web', 'recommend'),
(10003, '2026-01-05', '2026-01-05 10:05:00', 'cart', 5014, '手机数码', 0, 'web', 'detail'),
(10003, '2025-12-28', '2025-12-28 14:00:00', 'view', 5015, '手机数码', 85, 'mobile', 'home'),
(10003, '2025-12-28', '2025-12-28 14:05:00', 'buy', 5015, '手机数码', 0, 'mobile', 'detail'),
(10003, '2025-12-20', '2025-12-20 11:30:00', 'view', 5019, '服饰鞋包', 110, 'web', 'search'),
(10003, '2025-12-20', '2025-12-20 11:40:00', 'buy', 5019, '服饰鞋包', 0, 'web', 'detail'),
(10003, '2025-12-15', '2025-12-15 09:00:00', 'view', 5010, '服饰鞋包', 95, 'mobile', 'home'),
(10003, '2025-12-15', '2025-12-15 09:10:00', 'cart', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2025-12-15', '2025-12-15 09:15:00', 'buy', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2025-12-10', '2025-12-10 16:00:00', 'view', 5025, '美妆个护', 70, 'mobile', 'recommend'),
(10003, '2025-12-10', '2025-12-10 16:05:00', 'favorite', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10003, '2025-12-05', '2025-12-05 10:30:00', 'view', 5012, '智能穿戴', 120, 'web', 'search'),
(10003, '2025-12-05', '2025-12-05 10:40:00', 'buy', 5012, '智能穿戴', 0, 'web', 'detail'),
-- ========== 用户10004(新活跃用户 - 最近刚注册活跃)==========
(10004, '2026-02-19', '2026-02-19 10:00:00', 'view', 5012, '智能穿戴', 150, 'mobile', 'home'),
(10004, '2026-02-19', '2026-02-19 10:05:00', 'cart', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-19', '2026-02-19 10:10:00', 'buy', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-18', '2026-02-18 15:00:00', 'view', 5013, '智能穿戴', 130, 'mobile', 'search'),
(10004, '2026-02-18', '2026-02-18 15:05:00', 'buy', 5013, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-17', '2026-02-17 12:00:00', 'view', 5014, '手机数码', 110, 'web', 'recommend'),
(10004, '2026-02-17', '2026-02-17 12:05:00', 'cart', 5014, '手机数码', 0, 'web', 'detail'),
(10004, '2026-02-17', '2026-02-17 12:10:00', 'buy', 5014, '手机数码', 0, 'web', 'detail'),
(10004, '2026-02-16', '2026-02-16 18:00:00', 'view', 5015, '手机数码', 95, 'mobile', 'home'),
(10004, '2026-02-16', '2026-02-16 18:05:00', 'buy', 5015, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-15', '2026-02-15 09:00:00', 'view', 5001, '手机数码', 140, 'mobile', 'search'),
(10004, '2026-02-15', '2026-02-15 09:10:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-14', '2026-02-14 14:00:00', 'view', 5002, '手机数码', 100, 'mobile', 'recommend'),
(10004, '2026-02-14', '2026-02-14 14:05:00', 'cart', 5002, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-14', '2026-02-14 14:10:00', 'buy', 5002, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-10', '2026-02-10 11:00:00', 'view', 5025, '美妆个护', 80, 'mobile', 'home'),
(10004, '2026-02-10', '2026-02-10 11:05:00', 'buy', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10004, '2026-02-05', '2026-02-05 16:00:00', 'view', 5010, '服饰鞋包', 115, 'web', 'search'),
(10004, '2026-02-05', '2026-02-05 16:10:00', 'buy', 5010, '服饰鞋包', 0, 'web', 'detail'),
-- ========== 用户10005(稳定复购用户)==========
(10005, '2026-02-18', '2026-02-18 10:00:00', 'view', 5016, '家用电器', 180, 'mobile', 'home'),
(10005, '2026-02-18', '2026-02-18 10:10:00', 'cart', 5016, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-18', '2026-02-18 10:15:00', 'buy', 5016, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-15', '2026-02-15 14:00:00', 'view', 5017, '家用电器', 200, 'mobile', 'search'),
(10005, '2026-02-15', '2026-02-15 14:15:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-10', '2026-02-10 16:00:00', 'view', 5018, '家用电器', 170, 'web', 'recommend'),
(10005, '2026-02-10', '2026-02-10 16:10:00', 'favorite', 5018, '家用电器', 0, 'web', 'detail'),
(10005, '2026-02-10', '2026-02-10 16:15:00', 'buy', 5018, '家用电器', 0, 'web', 'detail'),
(10005, '2026-02-05', '2026-02-05 11:00:00', 'view', 5009, '家用电器', 220, 'mobile', 'home'),
(10005, '2026-02-05', '2026-02-05 11:20:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-01-28', '2026-01-28 10:00:00', 'view', 5024, '家用电器', 250, 'mobile', 'search'),
(10005, '2026-01-28', '2026-01-28 10:20:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-01-20', '2026-01-20 14:00:00', 'view', 5006, '电脑办公', 190, 'mobile', 'recommend'),
(10005, '2026-01-20', '2026-01-20 14:15:00', 'cart', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10005, '2026-01-20', '2026-01-20 14:20:00', 'buy', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10005, '2026-01-15', '2026-01-15 09:00:00', 'view', 5020, '手机数码', 160, 'web', 'home'),
(10005, '2026-01-15', '2026-01-15 09:10:00', 'buy', 5020, '手机数码', 0, 'web', 'detail'),
(10005, '2026-01-08', '2026-01-08 10:00:00', 'view', 5021, '手机数码', 175, 'mobile', 'search'),
(10005, '2026-01-08', '2026-01-08 10:10:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
-- ========== 用户10006(单次购买用户 - 低活跃)==========
(10006, '2026-01-10', '2026-01-10 11:00:00', 'view', 5019, '服饰鞋包', 120, 'mobile', 'home'),
(10006, '2026-01-10', '2026-01-10 11:05:00', 'cart', 5019, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2026-01-10', '2026-01-10 11:10:00', 'buy', 5019, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2026-01-05', '2026-01-05 14:00:00', 'view', 5010, '服饰鞋包', 90, 'mobile', 'search'),
(10006, '2026-01-05', '2026-01-05 14:05:00', 'favorite', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2025-12-28', '2025-12-28 10:00:00', 'view', 5011, '服饰鞋包', 85, 'web', 'recommend'),
(10006, '2025-12-28', '2025-12-28 10:05:00', 'cart', 5011, '服饰鞋包', 0, 'web', 'detail'),
-- ========== 用户10007(VIP高价值用户 - 高频高消费)==========
(10007, '2026-02-19', '2026-02-19 09:00:00', 'view', 5020, '手机数码', 280, 'mobile', 'home'),
(10007, '2026-02-19', '2026-02-19 09:15:00', 'cart', 5020, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-19', '2026-02-19 09:20:00', 'buy', 5020, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-18', '2026-02-18 10:30:00', 'view', 5021, '手机数码', 260, 'mobile', 'search'),
(10007, '2026-02-18', '2026-02-18 10:45:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-17', '2026-02-17 11:30:00', 'view', 5022, '电脑办公', 300, 'web', 'recommend'),
(10007, '2026-02-17', '2026-02-17 11:50:00', 'buy', 5022, '电脑办公', 0, 'web', 'detail'),
(10007, '2026-02-16', '2026-02-16 15:00:00', 'view', 5023, '手机数码', 240, 'mobile', 'home'),
(10007, '2026-02-16', '2026-02-16 15:15:00', 'favorite', 5023, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-16', '2026-02-16 15:20:00', 'buy', 5023, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-15', '2026-02-15 10:00:00', 'view', 5024, '家用电器', 320, 'mobile', 'search'),
(10007, '2026-02-15', '2026-02-15 10:25:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-12', '2026-02-12 14:00:00', 'view', 5006, '电脑办公', 270, 'web', 'recommend'),
(10007, '2026-02-12', '2026-02-12 14:20:00', 'buy', 5006, '电脑办公', 0, 'web', 'detail'),
(10007, '2026-02-08', '2026-02-08 09:00:00', 'view', 5009, '家用电器', 290, 'mobile', 'home'),
(10007, '2026-02-08', '2026-02-08 09:20:00', 'cart', 5009, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-08', '2026-02-08 09:25:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-05', '2026-02-05 11:00:00', 'view', 5007, '电脑办公', 250, 'mobile', 'search'),
(10007, '2026-02-05', '2026-02-05 11:15:00', 'buy', 5007, '电脑办公', 0, 'mobile', 'detail'),
(10007, '2026-02-01', '2026-02-01 10:00:00', 'view', 5008, '家居生活', 230, 'web', 'recommend'),
(10007, '2026-02-01', '2026-02-01 10:15:00', 'buy', 5008, '家居生活', 0, 'web', 'detail'),
(10007, '2026-01-28', '2026-01-28 14:00:00', 'view', 5016, '家用电器', 210, 'mobile', 'home'),
(10007, '2026-01-28', '2026-01-28 14:15:00', 'buy', 5016, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-01-25', '2026-01-25 09:00:00', 'view', 5017, '家用电器', 200, 'mobile', 'search'),
(10007, '2026-01-25', '2026-01-25 09:15:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-01-20', '2026-01-20 10:00:00', 'view', 5018, '家用电器', 220, 'web', 'recommend'),
(10007, '2026-01-20', '2026-01-20 10:20:00', 'buy', 5018, '家用电器', 0, 'web', 'detail'),
(10007, '2026-01-15', '2026-01-15 15:00:00', 'view', 5001, '手机数码', 190, 'mobile', 'home'),
(10007, '2026-01-15', '2026-01-15 15:10:00', 'buy', 5001, '手机数码', 0, 'mobile', 'detail'),
-- ========== 用户10008(新用户 - 数据最新)==========
(10008, '2026-02-19', '2026-02-19 14:00:00', 'view', 5025, '美妆个护', 140, 'mobile', 'home'),
(10008, '2026-02-19', '2026-02-19 14:05:00', 'cart', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-19', '2026-02-19 14:10:00', 'buy', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-18', '2026-02-18 16:00:00', 'view', 5026, '美妆个护', 125, 'mobile', 'search'),
(10008, '2026-02-18', '2026-02-18 16:05:00', 'buy', 5026, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-17', '2026-02-17 10:00:00', 'view', 5001, '手机数码', 160, 'mobile', 'recommend'),
(10008, '2026-02-17', '2026-02-17 10:10:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-16', '2026-02-16 11:00:00', 'view', 5002, '手机数码', 135, 'mobile', 'home'),
(10008, '2026-02-16', '2026-02-16 11:05:00', 'cart', 5002, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-16', '2026-02-16 11:10:00', 'buy', 5002, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-15', '2026-02-15 14:00:00', 'view', 5012, '智能穿戴', 150, 'web', 'search'),
(10008, '2026-02-15', '2026-02-15 14:10:00', 'buy', 5012, '智能穿戴', 0, 'web', 'detail'),
(10008, '2026-02-12', '2026-02-12 09:00:00', 'view', 5010, '服饰鞋包', 110, 'mobile', 'recommend'),
(10008, '2026-02-12', '2026-02-12 09:05:00', 'cart', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10008, '2026-02-12', '2026-02-12 09:10:00', 'buy', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10008, '2026-02-08', '2026-02-08 15:00:00', 'view', 5014, '手机数码', 130, 'mobile', 'home'),
(10008, '2026-02-08', '2026-02-08 15:05:00', 'buy', 5014, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-05', '2026-02-05 10:00:00', 'view', 5015, '手机数码', 105, 'web', 'search'),
(10008, '2026-02-05', '2026-02-05 10:05:00', 'favorite', 5015, '手机数码', 0, 'web', 'detail'),
(10008, '2026-02-05', '2026-02-05 10:10:00', 'buy', 5015, '手机数码', 0, 'web', 'detail');
相关文章
|
5月前
|
存储 分布式计算 Java
PySpark入门教程(非常详细)从零基础入门到精通
本教程聚焦Spark Core核心原理,基于3.5.8版本,用Python详解RDD五大特性(分区、计算函数、依赖关系、分区器、首选位置)、容错机制、Shuffle、DAG调度及共享变量等,并通过WordCount实战演示。
666 4
PySpark入门教程(非常详细)从零基础入门到精通
|
4月前
|
存储 数据挖掘 OLAP
数仓入门篇-维度模型与第三范式
第三范式(3NF)是关系数据库规范化核心标准,要求消除传递依赖,确保数据无冗余、“一事一地”。维度模型则面向分析优化,采用星型结构与反规范化设计,以牺牲存储换查询性能与业务可读性。二者各适其用:3NF用于OLTP系统保一致性,维度模型用于OLAP场景提分析效率。(239字)
514 5
|
5月前
|
存储 安全 测试技术
并行多智能体系统的协调测试实战:从轨迹捕获到CI/CD的六个步骤
本文探讨并行多智能体系统的协调测试难题:当多个LLM驱动的智能体协同决策时,单个正确≠集体安全。传统单元测试失效,需构建以轨迹捕获、行为不变量、回放回归、黄金数据集和CI/CD集成为核心的新型测试框架,专治容量超限、状态陈旧、 reducer 冲突等典型协调故障。
251 2
并行多智能体系统的协调测试实战:从轨迹捕获到CI/CD的六个步骤
|
5月前
|
人工智能 算法 数据挖掘
《爱搜光年:医疗GEO中的向量空间锚定理论与问题定义》
爱搜光年首发医疗GEO技术体系,以“向量空间锚定”为核心,通过Embedding重构、知识图谱对齐与RAG路径控制,提升生成式AI中品牌实体的语义占位稳定性。杭州口腔医院案例显示:AI引用率↑2.55倍,SOV↑3倍,幻觉率↓62%。(239字)
285 8
|
5月前
|
算法 搜索推荐
《2026医疗行业GEO算法行为验证技术标准(技术版)》
爱搜光年(AISO)发布医疗GEO研究,首次定义生成式搜索下医疗内容的算法适配机制,涵盖向量稳定性、实体对齐、RAG拼接、Token密度、信源权重与幻觉抑制六大核心标准,并提出分级评估体系,揭示“算法结构稳定度”正取代关键词成为医疗内容竞争力的核心。
311 3
|
9月前
|
监控 测试技术 API
商品自动上架/下架接口实现指南
本文介绍如何设计并实现电商系统中的自动上架/下架接口,基于时间或库存阈值触发操作。采用Python与Flask框架,结合RESTful API与定时任务,提升商品管理效率与系统可靠性,适用于各类电商平台自动化运营。
|
SQL 分布式计算 NoSQL
使用Spark高效将数据从Hive写入Redis (功能最全)
使用Spark高效将数据从Hive写入Redis (功能最全)
1143 1