Professional Documents
Culture Documents
宏田 著
ISBN:978-7-111-63564-2
版权 有, 权 究
客服 :+ 86-10-68995265
客服 :service@bbbvip.com
官方 :www.hzmedia.com.cn
新 博 @华章数媒
公 号 华章电子 ( 号:hzebook)
目
前言
1章 用 画像 础
1.1 用 画像是 么
1.1.1 画像 介
1.1.2
1.2 数据
1.3 主要覆盖
1.4 开 阶 程
1.4.1 开 上 程
1.4.2 阶 关 出
1.5 画像应用的落
1.6 用 画像
1.6.1 景介
1.6.2 相关元数据
1.6.3 画像表 设计
1.7 定 画像
1.8 本章小
2章 数据
2.1 用 属 度
2.1.1 常见用 属
2.1.2 用 别
2.2 用 行为 度
2.3 用 消费 度
2.4 风险控制 度
2.5 社 属 度
2.6 其 常见 划分方
2.7 命名方
2.8 本章小
3章 数据存储
3.1 Hive存储
3.1.1 Hive数据 库
3.1.2 分区存储
3.1.3
3.1.4 ID-MAP
3.2 MySQL存储
3.2.1 元数据 理
3.2.2 监控预警数据
3.2.3 集存储
3.3 HBase存储
3.3.1 HBase 介
3.3.2 应用 景
3.3.3 工程化
3.4 Elasticsearch存储
3.4.1 Elasticsearch 介
3.4.2 应用 景
3.4.3 工程化
3.5 本章小
4章 数据开
4.1 计 开
4.1.1 近30日购 行为
4.1.2 最近来访
4.2 规则 开
4.2.1 用 价
4.2.2 用 度
4.3 掘 开
4.3.1 景
4.3.2 特征 取及开
4.3.3 文本分词 理
4.3.4 数据 理
4.3.5 文本TF-IDF权重
4.3.6 朴 贝 斯分
4.4 计 开
4.4.1 建
4.4.2 Kafka 介
4.4.3 Spark Streaming集成Kafka
4.4.4 开 及工程化
4.5 用 特征库开
4.5.1 特征库规划
4.5.2 数据开
4.5.3 其 特征库规划
4.6 权重计
4.6.1 TF-IDF词空
4.6.2 时 衰减 数
4.6.3 权重
4.7 相 度计
4.7.1 景
4.7.2 数据开
4.8 组 计
4.8.1 应用 景
4.8.2 数据计
4.9 数据服务层开
4.9.1 推送至营
4.9.2 接 调用服务
4.10 GraphX 计 用
4.10.1 计 理论及应用 景
4.10.2 数据开
4.11 本章小
5章 开 调
5.1 数据 斜调
5.2 并小文件
5.3 存 数据
5.4 开 表
5.5 本章小
6章 程调度
6.1 crontab命令调度
6.2 Airflow工 平台
6.2.1 础
6.2.2 Airflow服务 成
6.2.3 Airflow安装
6.2.4 主要 功
6.2.5 工 调度
6.2.6 本实
6.2.7 常用命令行
6.2.8 工程化调度方
6.3 数据监控预警
6.3.1 监控预警
6.3.2 服务层预警
6.4 ETL 常排
6.5 本章小
7章 用 画像 化
7.1 即时 询
7.2 视 与 询
7.3 元数据 理
7.4 用 分 功
7.5 分 功
7.6 本章小
8章 用 画像应用
8.1 营分
8.1.1 分
8.1.2 用 分
8.1.3 分
8.1.4 斗分
8.1.5 客服话术
8.1.6 特征分
8.2 准营
8.2.1 短 / 件营
8.2.2 效 分
8.3 化推荐与服务
8.4 本章小
9章 实 详解
9.1 风控 诈预警
9.1.1 应用 景
9.1.2 用 画像切入
9.2 A/B 效 试
9.2.1 景
9.2.2 用 画像切入
9.2.3 效 分
9.3 用 生命 期划分与营
9.3.1 生命 期划分
9.3.2 不同阶 的用 触 略
9.3.3 画像 生命 期 的应用
9.3.4 应用
9.4 高价 用 实时营
9.4.1 项目应用 景
9.4.2 用 画像切入
9.4.3 HBase应用 景小
9.5 短 营 用
9.5.1 景
9.5.2 画像切入及其应用效
9.6 Session行为分 应用
9.6.1 关 用 行为分
9.6.2 景
9.6.3 特征 建
9.6.4 分 方 与 论
9.7 效 监 报表搭建
9.7.1 景
9.7.2 理
9.7.3 动报表 件
9.8 用 特征库 目
9.8.1 景
9.8.2 应用方 及效
9.9 本章小
附 用 画像项目规划文
前言
为 么写这本
写这 解决方 的一 晚,我有时 ,科 时代
飞速 展,如 有一 我不 这一行 ,该 么来 年 斗
的时光 ?2019年,我 3次从0到1开始搭建用 画像 ,从离
开 、用 数据分 、ETL调度、 计 开 ,到 数据服务
层、应用画像数据服务 务方、获 务 的 馈,这一
来, 程是痛 的,收获是 富的。 斗的日子 , 望一步
步 的 ,谨以此 不 昼 前的日子致敬。
本 特
4)方 价 :包 上 后如 服务 务 景 生 务价
以及有待进一步完 的 方。
本 共9章, 章具 内容如下:
4章:也是本 的重 章 , 介 的 数据及相关 本的
开 是用 画像 建工 的重 。本章讲解 对常见的 计 、规则
、 掘 、 计 以及用 特征库 与用 相关的数据的
开 ,还进一步介 如 计 数据、 数据到服务层 的
开 。 GraphX 计 用 2度关 熟 的 介 如 度 掘
用 的关 关 。本章对 一小 进行 详细的讲解,并附有
套的代码计 程。
6章:讲解 如 用开 ETL工具Airflow实现画像 相关
务的工程化上 调度,以及对数据的监控预警 调度 常的排 。
主要读 对象
·市 : 助画像 解用 的特征以及运营用
的 略方 ,可重 关 2、8、9章的内容。
勘误 支持
由 平有限, 难免 存 疏 , 请读 评 正。
为此,读 可 (892798505@qq.com)
(administer00001) 馈有关 题,我将尽全力为读 进行解 。
致谢
1.1 用 画像是 么
互 步入 数据时代后,用 行为给 的 服务带来
一 列的改变 重 ,其 最 的变化 ,用 的一切行为
面前是可“ ”“分 ”的。 内 存 的原始数据
种 务数据,这是 营 动的真实记 ,如 更加有效 利用这
数据进行分 评 ,成为 更 数据 景的 题 。
随着 数据 术的 入研究与应用, 的关 日益 如 利
用 数据来为 细化运营 准营 服务, 要 细化运营,首先
要建立本 的用 画像。
1.1.1 画像 介
用 画像,即用 化, 收集用 的社 属 、消费
习 、 好特征 度的数据,进 对用 特征属 进
行刻画,并对这 特征进行分 、 计, 掘 价 ,从
象出用 的 全貌,如 1-1 示。用 画像可看 应用 数据
的根 ,是定 广 放与 化推荐的前 条件,为数据驱动运营
奠定 础。由此看来,如 从 数据 掘出有价 的 越
重要。
1-1 用 化
公司 数据 础建设上 入 ,也 不少报表,
务 觉 数据 报表 么区别,也 数据对 务
有 么帮助 价 ,究其原 ,其实是“数据静止 数据 库,是
的”。
用 画像可以帮助 数据“ 出”数据 库, 对用 进行
化推荐、 准营 、 化服务 样化服务,是 数据落 应用
的一 重要方 。数据应用 的层 划分如 1-2 示。
1-2 数据应用 的层 划分
1.1.2
用 画像建 其实就是对用 “ ”,从对用 的方
来看,一 分为3种 (如 1-3 示):① 计 ;②规则
;③机 学习 掘 。
1-3
1. 计
2.规则
该 用
行为及确定的规则 生。 如,对平台上“消
费 ”用 这一 径的定义为“近30 易次数≥2”。 实际开
画像的 程 ,由 运营 对 务更为熟 , 数据 对数据的
、分布、特征更为熟 , 此规则 的规则由运营 数
据 共同协 确定;
3.机 学习 掘
该 机 学习 掘 生,用 对用 的 属
行为进行预 判断。 如,根据一 用 的行为习 判断该用 是男
还是女 、根据一 用 的消费习 判断其对 的 好程度。
该 需要 掘 生。
项目工程实 ,一 计 规则 的 即可以 应用
需 , 开 占有 比 。机 学习 掘 用 预
景,如判断用 别、用 购 好、用 。一
,机 学习 开 期 ,开 成本 高, 此其开 占比
小。
更多书籍访问:www.j9p.com
1.2 数据
整 工程化方 , 赖的 础设施包 Spark、Hive、
HBase、Airflow、MySQL、Redis、Elasticsearch。除去 础设施 ,
主 还包 Spark Streaming、ETL、 端3 重要组成 分。
1-4 示是用 画像数 ,下面对其进行详细介 。
1-4 用 画像数
·MySQL:存储 元数据,监控相关数据,导出到 务 的数
据。
· 数据开 :用 画像工程化的重 ,包 计 、规
则 、 掘 、 计 的开 ,以及 计 功 的开 ,
画像数据 务 的 ,提 接 服务 开 内容。
1-5 用 画像主要覆盖
·开 调 : 加工、 计 本上 调度后,为
短调度时 、 障数据的稳定 ,需要对开 的 本进行 代重
、调 。
·用 画像应用:画像的应用 景包 用 特征分 、短 、
件、站内 、Push消 的 准推送、客服 对用 的不同话术、 对
高价 用 的 速退货退 VIP服务应用。
本 内容安排也分别 这8 的内容来展开。方 读 更
解用 画像是如 从0到1搭建 来并提 服务、驱动用 实
现营收 的。
1.4 开 阶 程
本 主要介 画像 开 上 的 程以及 阶 的关 出。
1.4.1 开 上 程
用 画像建设项目 程,如 1-6 示。
1-6 用 画像建设项目 程
一阶 :目 解读
二阶 : 务分解与需 调研
一阶 的需 调研 目 解读,我 已 明确 用 画像
的服务对象与应用 景,接下来需要 对服务对象的需 重 ,
现有 务 “数据字典”规 实 的关 关
,明确分 度。就后文将要介 的 言,需要从用 属 画
像、用 行为画像、用 好画像、用 好画像 角度去进行
务建 。
三阶 :需 景讨论与明确
本阶 ,数据运营 需要根据与需 方的 , 出
用 画像需 文 , 该文 明确画像应用 景、最终开 出的
内容与应用方 ,并就该文 与需 方 并确认无误。
三 阶 明确 需 景与最终实现的 度、
后,数据运营 需要 务与数据 库 已有的相关表,明确
与 务 景相关的数据 径。 该阶 ,数据运营方需要 出
用 画像开 文 ,该文 需要明确应用 景、 开 的 、
涉及的数据库与表以及应用实施 程。该文 不需要再与运营方讨
论, 需面 数据运营 内 就开 实施 程 成一致 见即可。
阶 :特征 取与 数据落表
六阶 : 下 数据验收与 试
七阶 : 上 布与效
六阶 ,数据 验收 后, Git进行版本 理,
上 。 用Git进行版本 理,上 后 持 应用效 及
务方 馈,调整 化 及相关权重 。
1.4.2 阶 关 出
为 证程序上 的准时 稳定 ,需要规划好 阶 的 务排
期 关 出。画像 的开 分为几 主要阶 ,包 前期
理、用 开 、ETL调度开 、 数据服务层、画像 端
开 、面 务方推广应用、为 务方提 营 略的解决方 ,
如表1-1 示。
表1-1 用 画像项目 阶 关 出
· 开 :根据 务需 应用 景 理 ,调研
务上定义的数据 径,确认数据来 ,开 相应的 。 开
整 画像项目 期 占有 比重。
·ETL调度开 : 理需要调度的 务 的 赖关 ,开 调
度 本及调度监控 警 本,上 调度 。
有 务 日常工 真正应用画像数据、画像 ,
更好 推动画像 的 代 化,带来 提升 营收 , 出
价 。
1.6 用 画像
这里 一 贯穿本 的实 来将 家更好 带入实际开
画像、应用画像 的 景 。本 主要介 景及相关的元数
据,以及开 可以设计的表 样 。
本 的开 工 , Spark计 擎,主要涉及的语言包
HiveQL、Python、Scala、Shell 。
1.6.1 景介
电 站 有 千万的 购用 ,
100 万种。用 平台上可进行 览、搜 、收藏、下单、购 行
为。 的运营需要解决两 题:一方面 、
资 的 景下,如 兼顾 目 的同时更好
消费 的需 ,为用 带来更 化的购物 验, 内容的 准推
荐,更好 提高用 的 击 化率;另一方面 用 规 不断 的
景下,运营方 虑建立用 预警机制,及时识别将要 的用
, 取运营措施挽 用 。
建立以来,数据 库 积 着 的 务数据、日 数据
及 数据。如 充分 掘 数据 库 的数据的价 ,有效支
持用 画像的建设,成为当前的重要工 。
1.6.2 相关元数据
本 ,可以获取的数据 其 分为: 务 数据 用
行为数据。其 务 数据是 用 平台上下单、购 、收藏物
、货物 送 与 务相关的数据;用 行为数据是 用 搜 条
、访 页面、 击 、提 表单 操 行为
生( 解 日 的 表 )的数据。
1.用 表
表1-2 用 表(dim.user_basic_info)
2. 订单表
订单表(见表1-3)存放 订单的 ,包 订单
号、用 id、用 姓名、订单生成时 、订单状 。
表1-3 订单表(dw.order_info_fact)
3. 日 表
表1-4 日 表(ods.page_event_log)
4.访 日 表
表1-5 访 日 表(ods.page_view_log)
5. 评论表
评论表(见表1-6)存放用 对 的评论 。
表1-6 评论表(dw.book_comment)
6.搜 日 表
表1-7 搜 日 表(dw.app_search_log)
7.用 收藏表
用 收藏表(见表1-8)记 用 收藏 的数据。
8.购物 表
表1-8 用 收藏表(dw.book_collection_df)
表1-9 购物 表(dw.shopping_cart_df)
1.6.3 画像表 设计
表 设计也是画像开 程 需要解决的一 重要 题。
日全 数据,即该表的日期分区 记 着 止到当 的全 用
数据。 如,“select count(*)from userprofile where
data='20180701'”这条语句 询的是userprofile表 止到2018年7月
1日的全 用 数据。日全 数据的 势是方 询, 是不 探
更细 度的用 行为。
1.日全 数据
如,对 主题 为“ ”的 ,插入“20190101”日的
全 数据,可 语句:insert overwrite table
dw.userprofile_userlabel_all
partition(data_date='20190101',theme='member',
labelid='ATTRITUBE_U_05_001')来实现。 询 止
到“20190101”日的被 上 的用 ,可 语句:select
count(distinct userid)from dw.userprofile_userlabel_all
where data_date='20190101'来实现。具 的开 程 4.1 详细
讲解。
2.日 数据
如, 用 “20180701”日 览 3C电子 4次
(act_cnt),即给该用 (userid) 上 对应的三
(tagid), (tag_type_id)为3C电子 ,行为
(act_type_id)为 览。这里可以 对 行为 两 字
度表的方 ,对数据进行 理。 如对 行为
(act_type_id)字 ,可以设定1为购 行为、2为 览行为、3为收
藏行为 , 行为 表 以数 定义用 行为 , 度表
护 数 对应的具 义。
该日 数据表可视为ODS层用 行为 明细。 询 程 ,
如对 用 id为001的用 , 询其 “20180701”日
到“20180707”日被 上的 ,可 命令:select*from
dw.userprofile_act_feature_append where userid='001'and
data_date>='20180701'and data_date<='20180707' 询。
该日 的表 记 用 的行为带来的 , 未计
用 上 的权重,计 权重时还需 进一步建 加工。
权重 详见4.6 的内容。
3.关 宽表设计
用 属 宽表设计(见表1-10),主要记 用 本属 。
表1-10 用 属 宽表设计
用 日 宽表设计(见表1-11),主要记 用 访 的
。
表1-11 用 日 宽表设计
1.7 定 画像
本 重 讲解如 运用 数据定 刻画用 画像, 对 用
的刻画除 定 度 ,定 刻画也是常见 。定 画像 见
用 研究 运营 岗位, 电话调研、 络调研 卷、当面 入访
谈、 上 三方权威数据 方 收集用 ,帮助其理解用 。这
种定 调研相比 数据定 刻画用 来说,可以更 确 解用
需 行为特征, 这 样本 是有限的, 出的 论也不一定 代
表 分用 的观 。
互 相关 建立用 画像时一 除 用 度
(userid)建立一套用 ,还 用 用设 度
(cookieid)建立相应的 。 cookieid 度的 应用也
容易理解,当用 有登 账 访 设 时,也可以 用
设 上的行为对该设 推送相关的广 、 服务。
下面详细介 用 的 成及应用 景。
2.1 用 属 度
2.1.1 常见用 属
用 属 是刻画用 的 础。常见用 属 包 :用 的年
龄、 别、安装时 、 册状 、 市、省 、 登 、历 购
状 、历 购 额 。
用 属 度的 建成后可以提 客服电话服务,为运营
解用 本 况提 帮助。
用 属 包 计 、规则 、机 学习 掘 。
计 的开 为 单,机 学习 掘 将 4.3 具
进行讲解。本 主要介 常见用 属 主要包 的 度。表
2-1给出 常用的用 属 度 。
表2-1 用 属 度 示
表2-1对 相同的一 ,需要判断 的关 为
互斥关 还是非互斥关 。 如, 判断 别时,用 别为男的
况下就不 同时为女, 以 为互斥关 ; 判断用 是
黑名单内时,用 既可 短 黑名单 ,也可 同时 件黑名单
, 以这种就为非互斥关 。
别是 用 的实际 别,一 可 用 册 、 写
调 卷表单 径获 。该 需要从相应的表 取数据即
可,加工 来 为方 。
用 购物 别是 用 购 物 时的 别取 。 如,一位实际
别为男 的用 ,可 常给妻子购 女 的衣物、包 ,
么这位用 的购物 别则是女 。
2.2 用 行为 度
用 行为是另一种刻画用 的常见 度, 用 行为可以 掘
其 好 特征。常见用 行为 度 (见表2-2)包 :用 订单相
关行为、下单/访 行为、用 近30 行为 、用 高频 时
、用 购 、 击 好、营 敏 度 相关行为。
表2-2 用 行为 度 示
2.3 用 消费 度
对 用 消费 度 的建设,可从用 览、加购、下
单、收藏、搜 对应的 入 , 越细越 确,给用 推荐
营 的准确 越高。如 2-1 示,根据用 相关行为对应
建设 ,本 确到 三 。
表2-3为用 消费 度的 设计。
2-1 用 消费 度 理
表2-3 用 消费 度 示
这里 一 景来介 建用 消费 度的 的应用。 女
装 动期 , 运营 需要 出平台上的 质用 ,并
短 、 件、Push 进行营 ,可以 “ 览”“收
藏”“加购”“购 ”“搜 ”与该女装相关 ”的 来 出
可 对该女装 兴 的 用 ,进一步组 其 (如“
别”“消费 额”“ 度” ) 出对应的高质 用 ,推送
到对应 。 此将 象成 后,可 +行为的组
应用方 到目 用 。
2.4 风险控制 度
互 的用 可 到薅 、 刷单、 贷 诈 行
为的用 ,为 防止这 用 给平台带来损 风险,互 公司需
要 风险控制 度 建 相关的 ,有效监控平台的不 用
。 公司 务方 , 如可从账号风险、设 风险、 贷风险
度入 建风控 度 。下面详细介 一 常见的风险控制
度的 示 ,如表2-4 示。
表2-4 风险控制 度 示
2.5 社 属 度
社 属 用 解用 的家庭成 、社 关 、社 好、社
程度 方面, 这 可以更好 为用 提 化服务。
表2-5是常用的社 属 度 示 。
表2-5 社 属 度 示
日常 用社 软件时,我 可以 现社 软件 的 广
我 的社 特征进行 化推送。如 2-2 示, 我
市、 常 及近期收藏的电 相关文章, 朋友 给我推
送 相关电 营 的广 。如 2-3 示, 我的星座 年龄
,推送 我 特征的婚庆摄 广 。
2-2 朋友 广 – 位 ( )
2-3 朋友 广 – 星座( )
2.6 其 常见 划分方
本章前5 从用 属 、用 行为、用 消费、风险控制、社 属
共 度划分归 用 。 对用 的归
并不局限 此, 应用 景对 进行归 也是常见的 划分
方 。 2-4展示 具 的画像 应用 景划分。
· 好细分:用 对 、 价 、 营 、购
的 好 、不同营 方 方面的 好特征;
·用 分层:对用 生命 期、RFM、消费 平 、 度
进行分层划分。
对 一 ,可以从 主题、刻画 度、 、一 归
角度入 来确定 的 一名称,如 2-5 示。
2-5 用 命名 度
· : 可划分为 计 、规则 。其 计
开 可直接从数据 库 主题表建 加工 成,规则 需要
公司 务 数据 况, 开 需要对数据 机 学习的 理
到相应的 。
·一 度: 主题 下面,进一步细分 度来刻画
用 。
参照上面的命名 度 命名方 ,下面 几 子来讲 如
命名 。
对 用 的 别 , 主题是 属 ,用 度为
userid, 属 。给男 用 上
“ATTRITUBE_U_01_001”,给女 用 上
“ATTRITUBE_U_01_002”,其 “ATTRITUBE”为 属 主
题,“_”后面的”U”为userid 度,“_”后面“01”为一 归 ,
最后面的“001” “002”为该一 下的 明细,如 是划分
高 低 用 的,对应一 下的明细可划分
为“001”“002”“003”。
对 互 来说,其存储的 用 访 日 数据 分
用 操 的行为特 ; 对 来说则可以更 从用 属
度去 富 。
3章 数据存储
画像 搭建的 程 ,数据存储的 术 是非常重要的一
项内容,不同的存储方 适用 不同的应用 景。本章主要介 用
Hive、MySQL、HBase、Elasticsearch存储画像相关数据的应用 景及
对应的解决方 。
3.1 Hive存储
本 内容主要介 用Hive 为数据 库的应用 景时,相应的
库表 如 设计。
3.1.1 Hive数据 库
建立用 画像首先需要建立数据 库,用 存储用 数据。
Hive是 Hadoop的数据 库工具, 赖 HDFS存储数据,提 的SQL
语言可以 询存储 HDFS 的数据。开 时一 用Hive 为数据
库,存储 用 特征库 相关数据。
数据 取到数据 库的 程如 3-1 示。
3-1 数据 取到数据 库
数据 库建 的 程 ,主要涉及事实表 度表的建 开
( 3-2)。
·事务事实表:用 描 务 程, 务 程的单一
务 程可进一步分为单事务事实表 事务事实表。其 单事务事实
表分别记 务 程,如下单 务记入下单事实表,支 务记
入支 事实表。 事务事实表 同一 表 包 不同 务 程,如
下单、支 、 收 务 程记 一 表 , 新 字 来判断
属 一 务 程。当不同 务 程有着相 时可 虑将 务
程放到 事务事实表 。
· 计 照事实表:用 看不同事件 的时 隔, 如分
用 从购 到支 的时 、从下单到订单完 的时 。一 适用
有明确时 期的 务 程。
3-2 数据 库建
·将数据分区存储,分别 行 ;
· 本 调 ;
· 一 共同的数据来 开 表。
根据 的 属 、行为属 、用 消费、风险控
制、社 属 度分别建立对应的 表进行分表存储对应的
数据。如 3-3 示。
· 属 表:dw.userprofile_attritube_all;
·行为属 表:dw.userprofile_action_all;
·用 消费表:dw.userprofile_consume_all;
·风险控制表:dw.userprofile_riskmanage_all;
·社 属 表:dw.userprofile_social_all
3-3 用 数据ETL 示
如创建用 的 属 宽表:
同样的,用 其 id 度(如cookieid、deviceid、registerid
)的 数据存储,也可以 用上面 的表 。
后将一 用 上的全 到一 字 ,
表 设计如下:
3-4 数据
开 udf函数“cast_to_json”将用 上的 成json字
, 行命令将 分区存储的 进行 :
insert overwrite table dw.userprofile_userlabel_map_all partition(data_date=
"data_date")
select userid,
cast_to_json(concat_ws(',',collect_set(concat(labelid,':',labelweight))))
as userlabels
from “用 度的 表”
where data_date= " data_date "
group by userid
后用 的存储 如 3-5 示
3-5 数据
将用 上的 进行 询 计 。 如, 画像
, 入用 id后 直接 询该表,解 id 对应的 权重
后,即可 前端展示该用 的相关 (如 3-6 示)。
3-6 用 询
3.1.4 ID-MAP
开 用 的时 ,有项非常重要的内容——ID-MApping,即
用 不同来 的 识 数据 识别为同一 主 。用 的
属 、行为相关数据分散 不同的数据来 , ID-MApping
用 不同 景下的行为 来,消除数据孤岛。 3-7展示 用
与设 的 对 关 。 3-8展示 同一用 不同平台 的行为
示 。
3-7 用 设 的 对 关
3-8 同一 用 不同平台 行为
下面 一 介 如 Hive的ETL工 完成ID-Mapping的
数据 工 。
表是 对 变化 表的一种设计方 ,记 一 事物从开
始到当前状 的全 状 变化 。
创建完成后, ETL调度将数据更新到ID-Mapping 表 ,
务 行如下。
数据写入表 ,如 3-9 示。
select *
from dw.cookie_user_zippertable
where start_date<='20190801' and end_date>='20190801'
如,目前存 一 记 userid cookieid关 关 的表, 是
为 对 的记 (即一 userid对应 条cookieid记 ,以及一条
cookieid对应 条userid记 )。这里可以 表的日期来 看
时 userid对应的cookieid。 看 用 (如32101029)
(如20190801)关 到的设 id( 3-10)。
select cookieid
from dw.cookie_user_zippertable
where userid='32101029' and start_date<='20190801' and end_date>='20190801'
3-10 用 表 记
上 可看出用 ‘32101029’ 历 曾登 3 设 , 限
定时 可 到特定时 下用 的登 设 。
开 需要 关 userid与cookieid的 对 关 ,如 不
加条件限制就 关 , 可 数据 题。
3-11 平台 视
3-12 理
3-13 用 画像调度 主要
1. 计 数据监控
2.服务层同步数据监控
有的 上 务 用MySQL、Oracle 关 数据库存储数据,
如短 、消 推送 。 画像数据与 上 务 时,
需要 虑将存储 Hive 的用 相关数据同步到 务 ,此
时MySQL可用 存储 集。
下面 一 来讲解如 用Sqoop将Hive 的 数据 移
到MySQL 。
if __name__ == '__main__':
export_data("dw.userprofile_userservice_all", '20181201')
其 用到 sqoop从Hive导出数据到MySQL的命令:
sqoop export
--connect 定JDBC 接字 ,包 IP 端 数据库名称 \
--username JDBC 接的用 名\
--passowrd JDBC 接的密码\
--table 表名\
--export-dir 导出的Hive表, 对应的是HDFS \
--input fileds-terminated-by ‘,’ 分隔 号
3.3.1 HBase 介
HBase是一 高 、列存储、可 、实时读写的分布 存储
,同样运行 HDFS 上。与Hive不同的是,HBase 数据库上实
时运行, 不是 MapReduce 务,适 进行 数据的实时 询。
画像 Hive里 出的 集数据可同步到HBase数据
库,用 上实时应用的 景。
下面介 几 本 :
· 单 row key访 ;
· row key的正则访 ;
·全表 描。
Rowkey设计时需要 三 原则:
· 一 原则:rowkey需要 证 一 ,不存 重 的 况。
画像 一 用用 id 为rowkey。
· 度原则:rowkey的 度一 为10-100bytes。
·散列原则:rowkey的散列分布有利 数据 衡分布
RegionServer,可实现负 衡。
·columns family: 列 ,HBase 的 列 归属 列
。列 是表的schema的一 分, 须 用表 前定义。划分
columns family的原则如下:
·是 具有相 的数据 ;
·是 具有相 的访 。
常用的 删改 命令如下。
1)创建一 表, 定表名 列 名:
2) 描表 数据,并显示其 的10条记 :
3) 用get命令读取数据:
4)插入数据:
5)更新数据:
务 上, 运营 组 用 (如“未 册用
” “安装 今 数”小 ×× ) 出对应的用 , 后
将对应 推送到“广 ”( 功 详见7.4 ),这样
画像 的ETL调度完成后对应 数据就被推送到HBase数据库进行
存储。 条件的新用 来访App时,由 接 读取HBase数据库,
询到该用 时为其推送该弹窗。
下面 工程 来讲解HBase 该触 用 景 的应用方
。
3-15 App弹窗推送内容( “ 刻”App)
3.3.3 工程化
运营 画像 (详见 7章) 根据 务规则定义组 用
出用 ,并将该 上 到广 (如 3-16
示)。
3-16 将待运营 上 到广
务 好规则后,下面我 来看 数据调度层面是如
运行的。
用 数据 ETL将 用 上的 后插入到目 表
,如dw.userprofile_userlabel_map_all(详见3.1.3 )。 后
数据存储为 用 id,以及 上对应的 集 ,数据 如
3-17 示。
3-17 userid用 数据
3-18 HBase的主从服务
行如下 本:
# 判断
global activenode
for node in ("10.xxx.xx.xxx","10.xxx.xx.xxx"): # 两台机 为Master,判断 台HMaster
状
command = "curl http://"+ str(node) + ":9870/jmx?
qry=Hadoop:service=NameNode,name=NameNodeStatus"
status = os.popen(command).read()
print("HBase Master status: ".format(status))
if ("active" in status):
activenode = node
create 'userprofile_labels', { NAME => "f", BLOCKCACHE => "true" , BLOOMFILTER =>
"ROWCOL" , COMPRESSION => 'snappy', IN_MEMORY => 'true' }, {NUMREGIONS =>
10,SPLITALGO => 'HexStringSplit'}
将待同步的数据写入HFile,HFile 的数据以key-value 对方
存储, 后将HFile数据 用BulkLoad 写入HBase集 。Scala
本 行如下:
object Hive2HBase {
def main(args: Array[String]): Unit = {
// 入日期参数 当前 的master
val data_date = args(0)
val node = args(1) //当前 的 ip
//创建HBase的
val conf = HBaseConfiguration.create()
conf.set("HBase.zookeeper.quorum", "10.xxx.xxx.xxx,10.xxx.xxx.xxx")
conf.set("HBase.zookeeper.property.clientPort", "8020")
// 将rdd 换成HFile需要的
val rdds = dataRdd.filter(x=>x._1 != null).sortBy(x=>(x._1,x._2._1,
x._2._2)).map(x => {
//KeyValue的实 为value
val rowKey = Bytes.toBytes(x._1)
val family = Bytes.toBytes(x._2._1)
val colum = Bytes.toBytes(x._2._2)
val value = Bytes.toBytes(x._2._3.toString)
(new ImmutableBytesWritable(rowKey), new KeyValue(rowKey, family, colum,
value))
})
//文件 存 hdfs的位
val locatedir = "hdfs://" + node.toString +
":8020/user/bulkload/hfile/usergroup_HBase_" + data_date
// locatedir生成的Hfile文件
rdds.saveAsNewAPIHadoopFile(locatedir,
classOf[ImmutableBytesWritable],
classOf[KeyValue],
classOf[HFileOutputFormat2],
conf)
//HFile导入到HBase
val load = new LoadIncrementalHFiles(conf)
//HBase的表名
val tableName = "userprofile_labels"
//创建HBase的 接,利用默认的 文件,读取HBase的master
val conn = ConnectionFactory.createConnection(conf)
//根据表名获取表
val table = conn.getTable(TableName.valueOf(tableName))
try {
//获取HBase表的region分布
val regionLocation = conn.getregionLocation(TableName.valueOf(tableName))
//创建一 hadoop的mapreduce的job
val job = Job.getInstance(conf)
//设 job名称, 命名
job.setJobName("Hive2HBase")
// 出文件的内容KeyValue
job.setMapOutputValueClass(classOf[KeyValue])
//设 文件 出key, outkey要用ImmutableBytesWritable
job.setMapOutputKeyClass(classOf[ImmutableBytesWritable])
// HFileOutputFormat2的
HFileOutputFormat2.configureIncrementalLoad(job, table, regionLocation)
//开始导入
load.doBulkLoad(new Path(locatedir), conn.getAdmin, table, regionLocation)
} finally {
table.close()
conn.close()
}
spark.close()
}
}
3-20 HBase 存储 数据
组 询对应的用 景 ,首先 组 的条
件 Elasticsearch 询对应的 数据, 后 数据去
HBase 获取rowkey对应的数据(Elasticsearch 的documentid
HBase 的rowkey 设计为用 id)。
3-21 Elasticsearch存储的HBase二 方
# 询Hive 数据
def check_Hive_data(data_date):
r = os.popen("Hive -S -e\"select count(1) from
dw.userprofile_usergroup_labels_all where data_date='"+data_date+"'\"")
Hive_userid_count = r.read()
r.close()
Hive_count = str(int(Hive_userid_count)
print "Hive_result: " + str(Hive_count)
print "Hive select finished!"
# 询HBase 数据
def check_HBase_data(data_date):
r = os.popen("HBase org.apache.hadoop.HBase.mapreduce.RowCounter
'userprofile_labels'\" 2>&1 |grep ROWS")
HBase_count = r.read().strip()[5:]
r.close()
print "HBase result: " + str(HBase_count)
print "HBase select finished!"
# 接 DB,将 询 插入表
db = MySQLdb.connect(host="xx.xx.xx.xx",port=3306,user="username",
passwd="password", db="xxx", charset="utf8")
cursor = db.cursor()
cursor.execute("INSERT INTO service_monitor(date, service_type, Hive_count,
HBase_count) VALUES('"+datestr_+"', 'advertisement',
"+str(Hive_userid_count)+","+str(HBase_count)+")")
db.commit()
本 将userid 为rowkey存入HBase,一方面 组 的
景 可以支持条件 询 用 ,另一方面可以支持单 用
的 询, 如 看 id用 上的 ,以 运营 决定是 对其
进行运营操 。
3-22 HBase离 数 服务
3.4 Elasticsearch存储
3.4.1 Elasticsearch 介
Elasticsearch是一 开 的分布 全文 擎,可以近 实时
存储、 数据。 且可 展 好,可以 展到上百台服务 ,
理PB 别的数据。对 用 询、用 计 、用
视分 这 对 应时 要 高的 景,也可以 虑 用
Elasticsearch进行存储。
3-23 Elasticsearch与关 数据库的对比
3.4.2 应用 景
HBase的存储方 并 有解决数据的高效 题。 实际应
用 , 常有根据特定的几 字 进行组 后 的应用 景,
HBase 用rowkey 为一 ,不支持 条件 询,如 要对库里的
非rowkey进行数据 询,往往需要 MapReduce 分布
进行计 ,时 延 上 比 高,难以同时 用 对 杂条件
询 高效率 应这两方面的需 。
为 既 支持对数据的高效 询,同时也 支持 条件 进
行 杂 询,需要 HBase上 建二 ,以 对应的需要。 本
我 用Elasticsearch存储HBase的 ,以支持 杂高效
的 询功 。
主要 询 程包 :
下面 用Elasticsearch解决用 计 分 应用 景的
来 解这一 程。
对 后的用 表
dw.userprofile_userlabel_map_all(3.1.3 ) 的数据进行 ,
掉一 无效字 , 到导入Elasticsearch的条件,如 3-25
示。
3-25 数据
后将dw.userprofile_userlabel_map_all数据写入
Elasticsearch ,Scala代码如下:
object HiveDataToEs {
工程 赖如下:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>6.4.2</version>
</dependency>
将该工程 包 后提 务, 入日期分区参数“20190101”
行。提 命令“spark-submit--class com.example.HiveDataToEs--
master yarn--deploy-mode client--executor-memory 2g--num-
executors 50--driver-memory 3g--executor-cores 2 spark-hive-
to-es.jar 20190101”。
3-26 Elasticsearch 询 的
从 可以看到,用 (total)为100000000 ,包
“ACTION_U_01_003”的用 有2500000 (doc_count)。
询 index 看 :
# 询命令
GET userprofile/_search
{
"query":{
"match_all": {}
}
}
询 如 3-27 示。
3-27 Elasticsearch 询 index数据
的计 分 景 , 的 代,前期 用Impala
进行计 ,一 费几十秒到几分 的时 , 用Elasticsearch
后,实现 对 计 的秒 应。
3.4.3 工程化
下面 一 工程 来讲解实现画像 “用
” “ 分 ”功 对用 计 秒 应的一种解决方 。
如,数据同步完成后 MySQL状
表“elasticsearch_state” 插入记 (如 3-29 示),当日数据
出正常时,state字 为“0”, 出 常时为“1”。 3-29 1月
20日导入的数据出现 常,则“state”状 字 1, 上接 描
该状 记 位后不读取1月20日数据, 是取用最近的1月19日数据。
3-28 工程化调度 导入Elasticsearch
3-29 Elasticsearch状 记 表
# 询es 的数据
def monitor_es_data(data_date):
userid_search = "curl http://10.xxx.xxx.xxx:9200/_cat/count/" + data_date +
"_userid/"
userid_num = str(os.popen(userid_search).read()).split(' ')[-1].strip()
return userid_num
# 更新MySQL状 位
if (esdata[0] == hivedata[0] ):
db = MySQLdb.connect(host="10.xx.xx.xx", port=3306, user="username",
passwd="password",
db="userprofile", charset="utf8")
cursor = db.cursor()
try:
select_command = "INSERT INTO `elasticsearch_state` VALUES ('"+
str(data_date) +"', 'elasticsearch', '0', '2');"
cursor.execute(select_command)
db.commit()
except Exception as e:
db.rollback()
exit(1)
3-31 用 计
3.5 本章小
本章讲解 用Hive、MySQL、HBase Elasticsearch存储 数
据的解决方 ,包 :Hive存储数据相关 表、 计 表的表
设计以及ID-Mapping的一种实现方 ;MySQL存储 元数据、监控
数据及 集数据;HBase存储 上接 实时调用的数据;
Elasticsearch存储 用 计 视分 。存储 程
涉及如下相关表。
·dw.userprofile_attritube_all:存储 属 度的
表;
·dw.userprofile_action_all:存储行为属 度的 表;
·dw.userprofile_consume_all:存储用 消费 度的 表;
·dw.userprofile_riskmanage_all:存储风险控制 度的
表;
·dw.userprofile_social_all:存储社 属 度的 表;
·dw.userprofile_userlabel_map_all: 用 度 的
表;
·dw.userprofile_usergroup_labels_all:存储计 后 数据
的表。
离 开 主要2章讲的数据 开 计 、
规则 、 掘 展开;实时 主要 对给用 展现实
时 强的 景开 相关数据,如首页新 弹窗、新 包 景;
用 特征库 用 的 次行为明细记 相关数据,如用 览、搜
、收藏、下单 行为明细,一 该特征库 日 时 分区; 计
应用 数据服务层 前, 务方需要组 用 的 来 出对应
, 计 功 组 划分出对应的 ; 数据服务
层将 务方根据 务规则 定出来的用 推送到不同的 务
去。
userid 度的 数据 插入到该表
(dw.userprofile_attribute_all) 。
首先将需要计 的 从目 表 取出来。
#!/usr/bin/env python
# encoding: utf-8
def main():
start_date = sys.argv[1]
start_date_str = str(start_date)
format = "%Y%m%d"
# python 初始化Spark
spark = SparkSession.builder.AppName("latest_30_acts").enableHiveSupport().getOrCreate()
spark.sql(user_consume_acts) # user_consume_acts 对应 二 代码 行的语句
if __name__ == '__main__':
main()
·driver-memory:Driver端内存 小;
·executor-memory:Executor端内存 小;
·executor-cores: Executor核数;
·num-executors: 动Executor的数 ;
务 行完成后将数据插入Hive数据表 ,如 4-1 示。
4-1 用 近30日购 行为
4.1.2 最近来访
本小 再介 一 最近一次来访 今 数(对应
“ACTION_C_02_001”)的开 。
最近一次来访 今 数从用 的访 日 表
(ods.page_view_log) 取, 本 行如下:
# 获取cookie最近一次访 日期
user_cookie_relation =
" select t.cookie_id as cookieid,
t.last_visit_time as last_date
from ( select cookie_id,
last_visit_time,
row_number() over(partition by cookie_id order by
last_visit_time desc) as rank
from ods.page_view_log
where data_date = " start_date_str "
and cookie_id is not null
) t
where t.rank =1
having cookie_id is not null "
# 将数据插入到cookie 表
last_visit =
"insert overwrite table dw.userprofile_action_all
partition(data_date="data_date",labelid='${labelid}')
select 'ACTION_C_02_001' as labelid,
cookieid,
datediff(to_date("data_date"),concat(substr(last_date,1,4),'-
',substr(last_date,5,2),'-',substr
(last_date,7,2))) as labelweight
from user_cookie_relation # 上一步骤 册的视
group by 'ACTION_C_02_001',
cookieid,
datediff(to_date("data_date"),concat(substr(last_date,1,4),'-',
substr(last_date,5,2),'-',
substr(last_date,7,2)))"
# 开 sparksession
spark =
SparkSession.builder.appName("cookieid_latest_visit").enableHiveSupport().getOrCr
eate()
spark.sql(last_visit)
务 行完成后将数据插入Hive数据表 ,如 4-2 示。
4-2 用 最近一次来访 今 数 数据
4.2 规则 开
规则 一 是
根据 务运营上的需要, 务层面制定规
则的 。这 带有一 为主观判断的 , 以 开 前
需要先进行数据调研,摸 本平台上 务数据的 况, 后再根据运
营 务规则开 相关 。
除 由数据开 写 本开 ,还可以根据设定的规
则, 用 平台上的行为进行 动 。比如用 触 的50
行为记 ,有40 记 是3C ,我 给用 上“数码
”的 。根据规则, 动化 重要的是 本平台 务数据
况设定好规则,同时也需要建立 试账号来 验 动 的准确
。
下面两小 相关 开 的 来介 规则 的开 。
4.2.1 用 价
RFM 是衡 用 价 的重要工具 方 ,RFM 主要由3 础 组成:(1)最
近一次消费(Recency),是 用 上一次购 时 ;(2)消费频率(Frequency),是
用 一定时 内的消费次数;(3)消费 额(Money),是 用 一定时 内 计
消费的 额。这3 础 进行组 可以划分出8 ,如表4-1 示。
表4-1 RFM用 价
用 历 易 额分布 况如 4-5 示。
# 用 RFM 度数据
user_rfm_info = " select user_id,
last_1y_orders,
last_1y_order_amount,
last_payid_date
from dw.order_info_fact
where data_date = "start_date_str "
and last_order_paid_time is not null
group by user_id,
last_1y_orders,
last_1y_order_amount,
last_payid_date"
将上面3 本的 行 “userprofile_RFM_value.py” 行:
#!/usr/bin/env python
# encoding: utf-8
if __name__ == '__main__':
main()
4-7 询用 价
4.2.2 用 度
务 景 , 常需要根据用 的 况给用 上高
、 、低 、 ,如 划定时 范 ,如将××
未访 的用 定义为 用 ,将×× 内 ×次的用 定义为高
用 ,需要 务数据调研 况来确定数 。
下面 一 用 度 的 来进行介 。
首先需要划分用 的 期, 期内,根据用 的
况进一步将其划分为高 、 、低 。 务上划分用
的 期时有 种方 。 如:
从 4-8可以看出,用 5 以后 访率下降速度减 , 访
率已 低 10%且后 趋势 持平稳。 5 为 即为用
期, 的关 是用 有访 App的行为。
# 近30日全 用
user_active = " select t.user_id,
count(*) as visit_num
from (select user_id,
data_date
from ods.user_visit_info
where data_date >= "month_day_ago"
and data_date <= "start_date "
and user_id is not null
group by user_id,
data_date
) t
group by t.user_id "
将视 的数据插入到用 表
dw.userprofile_attribute_all , 行如下代码:
user_active_status = " insert overwrite table userprofile_attritube_all
partition(data_date="data_date",labelid='${labelid}')
select t.labelid,
t.user_id as userid,
t.tagweight as labelweight
from (
select user_id,
case when visit_num <=5 then 'ACTION_U_05_001'
when visit_num >5 and visit_num<=10 then 'ACTION_U_05_002'
else 'ACTION_U_05_003' end as tagid,
visit_num as labelweight
from user_active
) t
将上面的两 本的 行
userprofile_active_churn_label.py 行:
#!/usr/bin/env python
# encoding: utf-8
# ACTION_U_05_003 高
# ACTION_U_05_002
# ACTION_U_05_001 低
def main():
format = "%Y%m%d"
start_date = sys.argv[1]
start_date = str(start_date)
strptime, strftime = datetime.datetime.strptime, datetime.datetime.strftime
date_str = datetime.datetime.strftime(datetime.date.today()-
datetime.timedelta(days=1),'%Y-%m-%d')
month_day_ago = strftime(strptime(start_date, format) -
datetime.timedelta(30), format)
spark =
SparkSession.builder.AppName("user_active_churn_label").enableHiveSupport().getOrC
reate()
returned_df1 = spark.sql(user_active).cache()
returned_df1.createTempView("user_active") # 册视
spark.sql(insert_user_active)
if __name__ == '__main__':
main()
行完 务后, 询“SELECT*FROM
dw.userprofile_attritube_all WHERE data_date="20190101"and
labelid
in('ACTION_U_05_001','ACTION_U_05_002','ACTION_U_05_003')
LIMIT 5”, 到如 4-11 示的 。
4-11 询用 度
4.3 掘 开
掘 需要应用 掘用 相关特征,一 用 相关的
掘 可以包 预 用 男女 别、预 用 击下单、判断用
已 将要 、判断用 购 好 。
由 掘 需要进行数据调研, 用 行为特征进行特征工
程开 、 参数调 以及上 工程化调度 开 环 ,一 开
期 。
本 一 给平台上文章 的 来讲解 掘 的开
。
4.3.1 景
目 站上积 与疾病主题相关的文章、帖子 文本数
据。由 历 原 ,这 文章 有 内容归 ,也 有 上相应的
,不 对内容进行 理。现 为 对文章 主题进行分 ,方
后期给 读相关文章的用 上对应的 ,需要先对 历 文
章、帖子( 4-12) 分 整理,同时对 文章 上与其主题相关
的 。
对 站内的全 历 文章、帖子数据进行如下操 :
2)为支持文章的集 化 理,根据文章内容 动为 文章 上
与其主题相关的 。
4-12 文章 别划分
4.3.2 特征 取及开
机 学习以 计理论为 础, 对已知的训练数据 计
分 从 获 规 ,再运用规 对未知数据 预 。 文本分 题
上的 本 是: —— 工对一 文 进行准确分 , 为训练
集样本;训练——计 机从 好的文 集 掘出 有效分 的
规则,生成分 ;分 ——将生成的分 应用 待分 的文 集
,从 获 文 的分 。
本 的文章 动分 的 程如 4-13 示。
4-13 文章分 数据建 程
4) 用朴 贝 斯分 方 对训练集数据进行训练, 到参数对
试集数据进行分 理。
用到的 数据 理 术包 文本分词、TF-IDF 、
朴 贝 斯分 。
4.3.3 文本分词 理
分词是将 的字序列 照一定的规范重新组 成词序列的
程, 文分词将一 字序列(句子)切分成一 独立的单词。为
建词空 ,首先需要对待分 文本 切词 理,将切好后的
词语写入 定的 径下。 这里,我 用Python 的jieba工具对文
本进行分词,同时 用jieba.analyse.extract_tags方 ( TF-
IDF ) 取文章的主题 。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import jieba
import jieba.analyse # 导入提取关 词的库
# 取 试集的主题关 词
def extract_theme(content):
themes = []
tags = jieba.analyse.extract_tags(content, topK=3, withWeight=True, allowPOS=\
['n','ns','v','vn'],withFlag=True)
for i in tags:
themes.append(i[0].word)
return str(themes)
if not os.path.exists(seg_path):
os.makedirs(seg_path)
detail_paths = os.listdir(file_path)
for detail_path in detail_paths: # 到文件 下具 文件 径
full_path = file_path + detail_path #原始文件下 文 径
file_content = read_file(full_path)
file_content = file_content.strip() # replace("\r\n", " ")
# 删除换行
file_content = file_content.replace("\'", "")
file_content = file_content.replace(" \ n ", "")
if __name__ == "__main__":
# 对训练集进行分词
train_words_path = './train_words/'
train_save_path = './train_segments/'
cast_words(train_words_path,train_save_path,theme_tag=None)
# 对 试集进行分词 取文章主题
train_words_path = './test_words/'
train_save_path = './test_segments/'
theme_tag_path = './theme_tag/' #存放 试集文章主题 径
cast_words(train_words_path, train_save_path, theme_tag=theme_tag_path)
本 定义:Bunch(label=[],filepath=[],contents=
[])。其 参数:
·filepath: 文件的存储 径。
代码 行如下(文件word_to_bunch.py):
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import pickle
import time
from sklearn.datasets.base import Bunch
'''
label: 文章
filepath: 文章 径
contents: 分词后的文章
'''
def read_file(file_path):
with open(file_path, "r",encoding= 'utf-8',errors='ignore') as fp:
content = fp.readlines()
return str(content)
if __name__ == "__main__":
train_save_path = './train_segments/'
train_bunch_path = "train_bunch_bag.dat"
word_to_bunch(train_save_path, train_bunch_path)
test_save_path = './test_segments/'
test_bunch_path = "test_bunch_bag.dat"
word_to_bunch(test_save_path, test_bunch_path)
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 读取bunch对象
def read_bunch(path):
with open(path, "rb") as fp:
bunch = pickle.load(fp) # joblib 同样可用 存储 文件
return bunch
# 读取文件对象
def read_file(path):
with open(path, "rb") as fp:
bunch = fp.read()
return bunch
# 写入bunch对象
def write_bunch(path,bunch):
with open(path, "wb") as fp:
pickle.dump(bunch,fp)
# 训练集
def train_tfidf_space(stopword_path, train_bunch_path, train_tfidf_data):
'''
stopword_path: 用词 径
train_bunch_path: 训练集语料 径
train_tfidf_data: 训练集tfidf数据 径
'''
bunch = read_bunch(train_bunch_path)
stopwords = read_file(stopword_path).splitlines() # 读取 用词
tfidf_space = Bunch(label=bunch.label, filepath=bunch.filepath,
contents=bunch.contents, tdm=[], space={})
vectorizer = TfidfVectorizer(stop_words=stopwords, sublinear_tf=True,
max_df=0.5)
tfidf_space.tdm = vectorizer.fit_transform(bunch.contents)
tfidf_space.space = vectorizer.vocabulary_
write_bunch(train_tfidf_data,tfidf_space)
# 试集
def test_tfidf_space(stopword_path, test_bunch_path, test_tfidf_data,
train_tfidf_data):
'''
stopword_path: 用词 径
test_bunch_path: 试集语料 径
test_tfidf_data: 试集tfidf数据 径
train_tfidf_data: 训练集tfidf数据 径,将训练集的词 空 赋 给 试集
'''
bunch = read_bunch(test_bunch_path)
stopwords = read_file(stopword_path).splitlines() # 读取 用词
tfidf_space = Bunch(label=bunch.label, filepath=bunch.filepath,
contents=bunch.contents, tdm=[], space={})
train_bunch = read_bunch(train_tfidf_data) #训练集tfidf数据
tfidf_space.space = train_bunch.space # 将训练集的词 空 赋 给 试集
vectorizer = TfidfVectorizer(stop_words=stopwords, sublinear_tf=True,
max_df=0.5, vocabulary=train_bunch.space)
tfidf_space.tdm = vectorizer.fit_transform(bunch.contents)
write_bunch(test_tfidf_data, tfidf_space)
if __name__ == '__main__':
# 训练集数据 理
stopword_path = "./chinese_stop_words.txt" # 用词表的 径
train_bunch_path = './train_bunch_bag.dat'
train_tfidf_data = './train_tfdifspace.dat'
train_tfidf_space(stopword_path, train_bunch_path,train_tfidf_data)
# 试集数据 理
test_bunch_path = './test_bunch_bag.dat'
test_tfidf_data = './test_tfidfspace.dat'
test_tfidf_space(stopword_path, test_bunch_path,
test_tfidf_data,train_tfidf_data)
行完程序后生成train_tfidfspace.dat test_tfidfspace.dat
数据文件。
4.3.6 朴 贝 斯分
一 的 分 方 可应用 文本分 ,常用的分 包
朴 贝 斯分 、支持 机分 。
本 对文本分 ,从 度、 率 F- 度 三 角度进行
评价。 设a表示分 将 入文本正确分 到 别的 数;b表
示分 将 入文本 误分 到 别的 数;c表示分 将 入
文本 误 排除 别 的 数;d表示分 将 入文本正确
排除 别 的 数;则该分 的 率、正确率 F-
度 的计 公 如下:
· 度:p=a/(a+b)×100%
· 率:r=a/(a+c)×100%
·F- 度 :F=(2×p×r)/(p+r)
该 程代码 行如下(文件nbayes.py):
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import pickle
from sklearn.naive_bayes import MultinomialNB
import warnings
from sklearn import metrics
warnings.filterwarnings("ignore")
# 读取bunch对象
def read_bunch(path):
with open(path, "rb") as fp:
bunch = pickle.load(fp) # joblib 同样可用 存储 文件
return bunch
# 分 存至文件
def save_file(save_path, content):
with open(save_path, "a",encoding= 'utf-8',errors='ignore') as fp:
fp.write(content)
# 朴 贝 斯分
def nbayes_classify(train_set, test_set):
'''
train_set: 训练集样本数据
test_set: 试集样本数据
:return: 试集样本分
'''
clf = MultinomialNB(alpha=0.5)
clf.fit(train_set.tdm, train_set.label) # 训练
predict = clf.predict(test_set.tdm)
return predict
if __name__ == '__main__':
# 导入训练集
train_path = './train_tfdifspace.dat'
train_set = read_bunch(train_path)
# 导入 试集
test_path = "./test_tfidfspace.dat"
test_set = read_bunch(test_path)
# 存 径
save_path = './classify_file.txt'
for label, filename, predict in zip(test_set.label, test_set.filepath ,
predict): #test_set
print(filename, "\t实际 别:",label,"\t-->预 别:", predict)
save_content = filename + "\t实际 别:" + label + "\t-->预 别:" + predict
+ '\n'
save_file(save_path, save_content) # 将分 写入txt
至此,文本分 程 的数据 理方 就介 完
,下面 4-16的文件 再 单 顾下 。
4-16 文件
4.4 计 开
前面3 介 的是离 的开 ,即 次ETL 务,一 为T+1日
的数据。本 内容介 实时 数据的开 。 实时订单分 ,
给首次登 App的新 用 弹窗推送、 放 包,实时分 用
景并进行推送 有广 的应用,这里 用Spark Streaming开 相关
的实时数据。
更多书籍访问:www.j9p.com
4.4.1 建
Spark Streaming是Spark Core API的 展,支持实时数据 的
理,并且有可 展、高 、容 的特 。数据可以从Kafka、
Flume 来 获取,可以 用map、reduce、window 高 函
数对 务 进行 理。最后, 理后的数据被推送到文件 、数
据库 (如 4-17 示)。
4-19 offset写入记
4-20 不同的Consumer Group消费消
4.4.3 Spark Streaming集成Kafka
Spark Streaming可以 Receiver Direct两种 来集成
Kafka。
4-21 Receiver 消费数据
4-22 Direct 消费数据
·解 数据,即解 消费的Kafka数据;
1.主函数
首先导入 需的 赖:
import com.alibaba.fastjson.JSON
import com.utils.{KafkaParaUtils, ParamsUtils, SparkUtils}
import org.apache.spark.streaming.kafka.HasOffsetRanges
import org.joda.time.DateTime
主函数里,首先创建一 StreamingContext对象,这是Streaming
功 的主要入 。StreamingContext对象从现有SparkConf对象 创
建。这里设 batch时 隔为5秒。
object MainWorkflow {
// 开始计
ssc.start()
ssc.awaitTermination()
}
}
4-23 印出当前消费的topic是“countly_imp”,partitionid
为0~11, 三列记 的是本次消费前的 移 , 列记 的是本次
消费后的 移 。
// 务 理
val parameter = message.flatMap( line=> {
// 来
val src = try{
JSON.parseObject(line._2).getJSONObject("c").get("src")
} catch {
case ex:Exception => "(unknown)"
}
4-23 Offset 移
2.从Kafka 读取数据
消费 消费Kafka的Offset数据记 Zookeeper , 开
Streaming程序消费Kafka数据时,先从Zookeeper 最近一次消费
的Offset位 ,如 有记 当前Topicid+Groupid消费 消费Offset的
位 ,则从记 开始 消费Offset。如 有记 ,则从当前
Offset最 开始消费。代码 实现如下:
上 从Zookeeper 获取Offset位 的方
KafkaParaUtils.readOffSet的实现 如下:
// 读取Kafka的Offset 移
def readOffSet(groupId:String, topic:String): Map[TopicAndPartition, Long] = {
println("------------> 读取 移 ")
val zkClient = getZKClient
// Kafka分区
val OffsetMap = collection.mutable.Map.empty[TopicAndPartition, Long]
try {
val partitionSeq = KafkaFunction.kafkaPartitionByTopic(zkClient, topic)
partitionSeq.map { p =>
// 默认 径
// println(s"zKGroupTopicDirs:
${KafkaFunction.zKGroupTopicDirs(groupId,topic)}\t;") //zKGroupTopicDirs
val offsetPath = offsetPathFun(topic, groupId, p)
println(s"offsetPath: ${offsetPath}")
// 移 询
val offsetTP = KafkaFunction.offsetStatTuple(zkClient,offsetPath)
println(s"offsetTP:${offsetTP}")
if (offsetTP != null) {
OffsetMap.put(TopicAndPartition(topic, p), offsetTP._1.toLong)
}
}
} finally {
zkClient.close()
}
OffsetMap.toMap
}
4-25 用 行为特征库规划ER
根据应用需要,创建表dw.cookie_feature_event_append来 建
用 特征,表 如表4-2 示。
表4-2 建用 特征表
·cookie_id:用 访 id。
·data_date:数据日期, 日进行分区。
该表 的act_name事件名称对应的数据来 可 致分为3种 :
1) 日 数据:用 访 页面时 击 、搜
关 词 日 上报记 ;
3)订单数据:用 订单及订单里面的 。
4-26 用 行为特征库开
本 ods.page_event_log是 日 表,从 日 表 获
取用 击相关行为的事件;从订单表dw.order_info_fact 获取
cookieid当日与相关的订单数据;从cookie的访 日 表
ods.page_view_log 获取cookieid当日访 详 页相关数据。
1.用 加购行为带来的
// 用 加购行为带来的
val AddToBagBehavior = (dateStr: String) =>
s"""
| INSERT INTO dw.cookie_feature_event_append PARTITION(data_date='${dateStr})
| SELECT t1.cookieid AS cookie_id,
| t1.product_id AS tag_id,
| t1.product_name AS tag_name,
| 'product' AS tag_type_id,
| count(1) AS act_num,
| t2.eventkey AS act_name
| FROM dw.order_info_fact t1
| INNER JOIN ods.page_event_log t2
| ON (t1.cookieid=t2.cookieid and t1.product_id=t2.product_id)
| WHERE t2.data_date='${dateStr}'
| AND t1.cookieid <> ''
| AND t1.product_id <> ''
| AND t2.eventkey IN
| ('$addtobag_click', // 加购 击
| '$addtobag_picture_click ', // 加购 片 击
| '$shopping_minus_click ', // 购物 击减号
| '$shopping_plus_click ', // 购物 击加号
| '$addtobag_submit_click', // 加购物 提
| '......')
| GROUP BY t1.cookieid,
| t1.product_id,
| t1.product_name,
| t2.eventkey
""".stripMargin
2.用 击行为带来的
// 击行为事件
val ClickBehavior = (dateStr: String) =>
s"""
| INSERT INTO dw.cookie_feature_event_append PARTITION (data_date='${dateStr})
| SELECT cookieid AS cookie_id,
| product_id AS tag_id,
| product_name AS tag_name,
| 'product' AS tag_type_id,
| count(1) AS act_num,
| eventkey AS act_name
| FROM ods.page_event_log
| WHERE data_date='${dateStr}'
| AND cookieid <> ''
| AND product_id <> ''
| AND eventkey IN
| ('$product_click', // 物 击
| '$pageview_brand_click', // 详 页 牌 击
| '$pageview_brandgoods_click', // 详 页 牌推荐 击
| '$pageview_details_click', // 详 页detail 看
| '$pageview_gallery_click', // 详 页 片 击
| '......')
| GROUP BY cookieid,
| product_id,
| product_name,
| eventkey
""".stripMargin
3.用 搜 行为带来的
// 搜 行为事件
val SearchBehavior = (dateStr:String) =>
s"""
| INSERT INTO dw.cookie_feature_event_append
PARTITION(data_date='${dateStr})
| SELECT cookieid AS cookie_id,
| product_id AS tag_id,
| product_name AS tag_name,
| 'product' AS tag_type_id,
| count(1) AS act_num,
| eventkey AS act_name
| FROM ods.page_event_log
| WHERE data_date='${dateStr}'
| AND cookieid <> ''
| AND product_id <> ''
| AND eventkey IN
| ('$search_product', // 搜 击
| '$search_result', // 搜 关 词 击
| '......')
| GROUP BY cookieid,
| product_id,
| product_name,
| eventkey
""".stripMargin
4-27 用 行为特征库数据
下面 两 询 子。
2: 询近7日 览、收藏、关 “ 婴” 的用 ,
取这 分用 对其进行消 推送营 , 询命令如下:
select cookieid
from dw.cookie_feature_event_append
where data_date >= ‘20180201’
and data_date <= ‘20180208’
and tag_type = ‘ 婴’
and event_name in
(‘$goodsdetail_view’,‘$wishlist_add’,‘$goods_click’,‘$addtobag_click’)
特征库的开 程 ,除 从用 度开 特征库,同样也
对 、 家 开 相应的特征库。 特征库可以更方 对用
、 、 家建 ,并分 特征及进行 应用。
4.5.3 其 特征库规划
除 要对用 特征库进行开 ,也需要 本公司的 进行特
征库的规划与开 。
表4-4 特征库设计方 示
4.6 权重计
用 平台上的不同行为具 到用 层面有着不同的行为权
重。 本 景 ,用 购 的行为权重要比用 加到购
物 、收藏 、 览 的行为权重 次要高。具 到
层面,需要用 画像建 与运营 密切 , 务 景
给不同的行为 定权重( 本 是 杂程度越高的行为价 越
),同时需要 虑 本 全 的权重属 。下面介
主观权重 分 TF-IDF 的 权重计 方 。
4.6.1 TF-IDF词空
TF-IDF是一种 计方 ,用以评 一 字 词相对 一 文件集
一 语料库 的其 词语的重要程度。字词的重要 随着它 文件
集 出现的次数的 加成正比 加,同时随着它 语料库 出现的频
率成 比下降。 本章介 的 ,对 用 来说,其 上同
一 出现的次数越 ,该 对 这 用 来说越重要,该
全 用 的 有 生的 集 出现的次数越 ,该 的重
要 越低。
rel(P,T)=TF(P,T)×IDF(P,T)
4-28 TF-IDF 计 权重示
4.6.2 时 衰减 数
当用 数据 到 的密集程度后,用 上 的 对应的属
表现出 高的稳定 ,这种稳定 与用 期行为 成的 真
实特征相匹 。 是也存 变化的适应 的 题。
如, 用 主要从事软件开 , 此其 电 站上
的搜 、收藏、购 行为主要集 与 程相关的内容上。 ,
如 该用 近期内 为运营 岗位,则其近期的 览与搜 就 突变
为与运营相关的内容。 是,将用 画像的属 描 从 程 为运营
并不 由此立刻实现,仍需要 时 的用 行为的积 ,直至 运营
下积 比 程更 的子分 。 是 换期 , 仍对用
推送 程相关 ,这显 离 用 的真实关 内容。
其 ,为衰减常数,可 归计 出。 如: 定45分 后
物 度为初始 度的0.5 ,即0.5=1×exp(–×45),
=0.1556。
用 画像的应用 ,用 的 行为 随时 衰减, 行
为不 随时 衰减。一 来说,用 操 的 杂程度越高,其行为随
时 衰减的 越小,我 可视该 行为不随时 衰减(如下单、
购 行为)。对 随时 衰减的行为, 计 行为权重时需 虑时
,衰减方 可套用牛顿冷却定 ;对 不随时 衰减的行为则不
虑时 的 ,如表4-5 示。
表4-5 用 行为受时 的
4.6.3 权重
用 的权重最终还是需要进一步 的 务 景、
离当前时 、用 行为 生该 的行为次数 ,最终 到用
权重的 分公 :
公 参数的 义如下:
·行为次数:用 权重 计,用 与该 生的
行为次数越 ,该 对用 的 越 。
4-29 相关 计 (示 )
从 4-30 可以看到,当前有 用 , 用
上 被 上 一 。 B C 用 上同时出现,
此可以初步认为 B C存 一定程度上的相关 。
熟知的“ 尿布”的 子,一家 市 现 用 消费 同时
购 尿布, 是将尿布 摆 一 出 , 现这两种
的 加 。该 景 这两种 / 同时出现 用
的 上, 么我 可以初步认为这两种 / 存 一定程度上的相
关 。
4-30 用 到 相关 (示 )
本 ,用 医疗 上的行为 给其带来诸 ,
的 可以划分为医生、医院、科室、疾病、药 不同种
。现 需要对疾病 到其对应的科室下面。
用 行为特征库表 设计:
计 “疾病” 下 疾病 对应的用 数。
4-31 疾病与科室的同现矩阵(示 )
本 如下:
-- 用 相 度函数计 两两 的相关
create table dw.tag_relation_function_06
as
select t1.tag_id_1, --疾病 id
t1.tag_name_1, --疾病 名称
t1.tag_type_id_1, --疾病
t2.user_num_1, --疾病 数
t1.tag_id_2,
t1.tag_name_2,
t1.tag_type_id_2 ,
t3.user_num_2, --科室 数
t1.num as num, --同时有两 的用 数
(t1.num/sqrt(t2.user_num_1 * t3.user_num_2)) as power,
row_number() over(order by (t1.num/sqrt(t2.user_num_1 * t3.user_num_2))
desc) rank
from dw.tag_relation_function_05 t1
left join (select tag_id,
user_num as user_num_1
from dw.tag_relation_function_03 --疾病 对应的用 数
) t2
on t1.tag_id_1 = t2.tag_id
left join (select tag_id,
user_num as user_num_2
from dw.tag_relation_function_04 --科室 对应的用 数
) t3
on t1.tag_id_2 = t3.tag_id
出与 疾病 相关 最 的科室 ,即将该疾病
归 到相关 最 的科室下面。 row_number()方 出权重
最 的科室 顶, 行如下。
-- row_number()方 出权重最 的科室 并 顶
create table dw.tag_relation_function_07
as
select tag_id_1, --疾病 id
tag_name_1, --疾病 名称
tag_id_2, --科室 id
tag_name_2, --科室 名称
power
from (select tag_id_1,
tag_name_1,
tag_type_id_1,
tag_id_2,
tag_name_2,
tag_type_id_2,
power,
row_number() over(partition by tag_id_1 order by power desc) row_id
from dw.tag_relation_function_06
) t1
where t1.row_id=1
4-33 组 计 景
组 计 的实现 , 来说分为3 程:
·读取不同组 的计 规则;
·将 规则 接成接 入参数的 询命令, 接 方 进
行 询;
·接 询计 时, Elasticsearch 询 这 条件的用
id, 用 id 为rowkey去HBase 询这 用 上的 。
4.8.2 数据计
务 画像 端可以组 定 (见 4-34),对
应 关 数据库 将 记 该条 规则包 的用 。
4-34 组 定
· 名称:该条 规则 务定义上的名称。
· 规则: 组 规则 包 的 及 。
· 数 :该 对应的数 。
·创建时 :该 规则的首次创建时 。
· 改时 :该 规则的最近一次 改时 。
·是 应用:该 是 应用到 上。
4-35 组 规则示
几 典 的应用 景包 :
5)BI数据:可以监控核 用 的变化,为上层决 提 数据
础支持。
用 画像 数据服务层除 力 省、 程 化
方面带来诸 利 , 营 (如同时 短 、 件、消 推
送 ) 动时,可以 设 排 已 其 营 的
用 ,排除对用 的 次 ,同时 省 的营 费用。
下面将介 两种常见的 务 的方 。
4.9.1 推送至营
如 公司有 一的营 ,则 需要应用到服务端的数据 一
入服务层对应的数据库 。一 来说,服务层 用HBase、
Elasticsearch 进行数据存储。
4-38 消 推送(push)内容
4-39 短 营 用 景
接 调用时需要定义好接 的请 、请 参数、 参数
关 。
(1)接 说明
本接 主要用 支持 询用 。
(2)请 参数
用 询的 ,如 说 入用 id 数据的时 询该
用 上的全 ,则参数为用 id 时 。
请 参数示
{
"data_date":"20190101",
"id":"e598027d-5412-4e7b-84a2"
}
(3)接
如接 为“http://xxxx.api.com/userprofile”,上面的
请 接为“http://xxxx.api.com/userprofile?
data_date=20190101&id=e598027d-5412-4e7b-84a2”。
(4)调用方
一 以GET方 送请 。
(5)
常见的 状 (code):
下面我 看一 接 请 用 上的 , 的数据:
{"code":"200",
"data":
{
"userprofile":{
"id": "e598027d-5412-4e7b-84a2",
"tags": [
{
"tagid": "ATTRITUBE_U_06_001",
"tagweight": 6
},
{
"tagid": "ATTRITUBE_U_02_001",
"tagweight": 1
},
{
"tagid": "ACTION_U_05_003",
"tagweight": 3
},
{
"tagid": "ATTRITUBE_U_01_001"
},
{
"tagid": "ACTION_U_05_003",
"tagweight": 1
},
{
"tagid": "CONSUME_U_05_003",
"tagweight": 15
},
{
"tagid": "CONSUME_U_05_003",
"tagweight": 5
}
]
}
}
}
上面 接 入用 id的方 请 用 上的 , 组
的应用 ,同样可以 入需要组 的 及 的关 ,
接 方 询同时 这 对应的用 。
4.10.1 计 理论及应用 景
Spark GraphX是分布 计 , Spark平台提 对 计
的 单且 富的接 ,以 对分布 理的需 。
以及 对应的RDD:
顶 创建 :
GraphX 可 种方 创建一 。
·Graph(VertexRDD,EdgeRDD): 入顶 的RDD创建
,上面介 的 即用这种方 创建 。
·Graph.fromEdges:由 的RDD创建 , 动将 有顶 的属
设 为默认 。
·Graph.fromEdgeTuples:由 元组 生成 , 赋 为1, 动
创建 涉及的 有顶 并赋默认 。
·GraphLoader.edgeListFile: 解 ( 顶 、目 顶 )
的数据 到 接关 。下面一 介 的 将 用此种方 创
建 。
下面 一 实际 景 介 如 开 N度关 用 的列表。
4.10.2 数据开
实际 景存 用 登 同一 机上的 App,也存 同
一 用 机上登 该App的 况,这里初步认为 同一 机
上登 的用 是熟 关 , 这种熟 关 需要进一步 掘用
的二度熟 。即 用 朋友的朋友也有可 是该用 的 好友。
4-42 可初步推断:111、222、333 C 机上登 ,
相互熟 ,333 999 F 机上登 , 是熟 , 次
推。这样,我 可以根据用 这种相互 的熟 进行计 的二
度关 熟 。
4-42 用 登 机关 分布
· 一次 历,获取本 的 有 居 ,即获取1 的 居
2、3、4;
· 二次 历,获取 有 居 的 居 ,将 的二度
居 进行 计。即获取2、3、4的 居 ,将其 给1。
4-43 计 二度好友
GraphX 核 操 是调用API:aggregateMessages,它负责
送消 ,以及 并收到的 消 。
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.graphx._
object GraphxUser {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setAppName("Graphtx-Calculate-Userprofile")
conf.setMaster("local[*]")
val sc = new SparkContext(conf)
// 造
val graph=GraphLoader.edgeListFile(sc,"C:/Users/user/Desktop/relations.txt")
val graphxNeighborUser=new GraphxNeighborUser
// 二度关 用 列表
val neighborIds=graphxNeighborUser.getSecondUserIds(333,graph)
println("neighborIds: "+ secondIds.mkString(","))
}
}
GraphxNeighborUser对象 定义 getSecondNeighborIds方 用
计 用 的二度好友, 该方 嵌套调用getFristNeighborIds
方 获取用 的一度好友。 行如下:
import scala.collection.immutable.HashSet
import scala.collection.mutable.ArrayBuffer
import org.apache.spark.graphx.{Graph, VertexRDD}
object GraphxNeighborUser {
// 获取二度好友
def getSecondUserIds(id:Long, graph:Graph[Int,Int]) = {
getSecondNeighborIds(getFristNeighborIds(id,graph), graph)
}
// 根据用 id获取其一 居
def getFristNeighborIds(id:Long, graph:Graph[Int,Int])={
var fristIds=new HashSet[Long]() // 存储一 居的集
//aggregateMessages 送给 条 的 顶 的消
val firstNeighbor = graph.aggregateMessages[Int](triplet=>{
if(triplet.srcId==id ){
triplet.sendToDst(1) //给目 顶 送 记位
}
} ,(a,b)=>b ) // 顶 接收到的消
firstNeighbor.collect().foreach(
a=> fristIds+=a._1
)
fristIds
}
// 根据用 id获取其二 居
def getSecondNeighborIds(firstIds:HashSet[Long] , graph:Graph[Int,Int])={
val secondryIds = new ArrayBuffer[Long]() // 存储二 居的集
firstIds.foreach(id=>{
val secondNeighbors=getFristNeighborIds(id,graph) // 获取 一 居的二 居
secondNeighbors.foreach(
secondId=>secondryIds+=secondId)
})
secondryIds
}
}
行 务后根据下面 的 可知333的一 居包 111、222
999, 后将这三 一 居进一步 代获取这三 居的一
居, 后将二次 代后的 居数据 给333。二次 代的 居 包
111、222、333 一 居,需要对其进行 ,下面是获
的二次 代 居:
最终获 333的二度好友列表:
444,555,666,777,888,777,777,000
从二度好友列表可以看出:
照共同熟 数排序后,可认为777是333的 熟 。
计 用 的 好友, 掘用 关 景 有 应
用, 如 3.1.4 的ID-MAP章 ,同样可 用 计 的方 来 掘
不同用 设 的关 。
4.11 本章小
本章是全 的重 章 ,介 画像 相关数据的开 工
应用 景 方面的内容,以 的 对 象的 方进行 详细介
。
5-1 示的是一 典 的 子。
5-1 数据 斜 景
bb这 key 3 上有11条数据,aa cc 3 上分别有2
条 1条数据,这 数据 被 取到一 task上 理。 理bb这
task的运行时 可 是 理aa cc的task的运行时 数 ,整 运行
速度由最 的task决定。
方 一: 掉 斜数据
select cookieid,
count(*) as num
from ods.page_event_log
where data_date = "20190101"
group by cookieid
distribute by cookieid
sort by num desc limit 10
select cookieid,
count(*) as num
from dw.order_info_fact
group by cookieid
distribute by cookieid
sort by num desc limit 10
方 二: 入随机数
select t1.user_id,
t2.order_num
from (select user_id
from dim.user_info_fact # 用 度表
where data_date = "20190101"
and user_status_id=1
) t1
join ( select user_id,
count(*) as order_num
from dw.dw_order_fact # 订单表
where site_id in (600, 900)
and order_status_id in(1,2,3)
group by user_id
) t2
on t1.user_id = t2.user_id
用 度表 有2000万条数据,订单表有10 条数据, 务 未
化前 行 1 小时也 有 出 ,判断可 是出现 数据 斜。
这里可以将原本相同的key 加随机前 的方 变成
key,这样将原本被一 task 理的key分散到 task上先 一次
, 后去掉前 再进行一次 到最终 。 程如 5-4 示。
5-4 两阶
改后代码 行如下:
select t1.user_id,
t2.order_num
from (select user_id
from dim_user_info_fact
where data_date = "20190101"
) t1
join ( select t.user_id,
sum(t.order_num) as order_num
from (select user_id,
round(rand()*1000) as rnd,
count(1) as order_num
from dw.order_info_fact
where pay_status in (1,3)
group by user_id,round(rand()*1000)
) t
group by t.user_id
) t2
on t1.user_id = t2.user_id
5.2 并小文件
Spark 行“insert overwrite table表名”的语句时,由
程并行 HDFS写入且RDD默认分区为200 , 此默认 况下 生
200 小文件。
// 并插入用 宽表数据的分区
val executesqls = spark.sql(
"""
| select user_id,
| org_id,
| org_name,
| sum(act_weight) as act_weight,
| sum(cnt) as cnt
| from dw.peasona_user_tag_relation
| where user_id is not null
| and user_id <> 'null'
| group by user_id,org_id,org_name
""".stripMargin).rdd.coalesce(1)
spark.sql(
s"""
| INSERT OVERWRITE TABLE dw.peasona_user_tag_relation
partition(data_date="$data_date")
| SELECT user_id,org_id,org_name,act_weight,cnt
| FROM user_act_info
""".stripMargin)
5.3 存 数据
Spark的一 重要的 力就是将数据持 化 存,这样 操
期 可以访 这 持 化的数据。当持 化一 RDD时, 的
其 分区 可以 用RDD 内存 进行计 , 该数据上的其 action
操 将直接 用内存 的数据,这样 其操 计 速度加 。对RDD
的 杂操 如 有持 化, 么一切的操 从 开始,一步
步往后计 ,不 用原始数据。
画像 ETL的时 ,对 一 计 可以不落磁
盘, 需 数据 存 内存 。 用Hive进行ETL时需要将一
计 落 时表 , 用完 时表后再将其删除。
·MEMORY_ONLY: 存储 内存 ;
·MEMORY_ONLY_2: 存储 内存 , 分区 集 两
上建立副本;
·DISK_ONLY: 存储 磁盘 ;
其 cache方 同 调用persist()的MEMORY_ONLY方 。
这里介 一 开 画像 时 存 数据的 。
行如下代码:
// 读取原数据 下单用
val peopleRDD =
spark.sparkContext.textFile("C:\\Users\\king\\Desktop\\practice\\cookiesession")
.map(_.split(",")) // RDD[Array[String]]
.map( row => Row(row(0),row(1),row(2),row(3),row(4))) // RDD[Row]
peopleRDD.persist(StorageLevel.MEMORY_ONLY)
peopleRDD.createOrReplaceTempView(“user_base_info”)
这里将读取的用 数据 存 内存 并 册为一 视 。后 直
接从视 读取对应用 数据。 该Spark 务 行完成后, 放内
存,不需要 除该 存数据。
5.4 开 表
用画像 代开 的 程 ,初期开 完 后, 对
加工 的血 整理,可以 到 用相同数据 的 ,对这 分
,可以 加工 表 减 日画像调度 时 。
层设计前需要明确几 重要的 :
1)这 层对应的 务 景、 务目 是 么?
3)这 务 景分 包 分 度 ?
4)同时面 务 景的 层不一定是好的 层。
开 代的 程 ,开 初期 用crontab命令调度开 务
定时 行, 随着调度 务规 的 加, 用Kettle、Airflow这样的
工具替代crontab 定时调度 提高集 工 效率。一方面可以帮助厘
务 的 赖关 ,另一方面当调度出现 常时可 速定位出现
题的位 。
6.1 crontab命令调度
画像开 的初期阶 ,为 数据尽 上 代,对 调度
规范化的要 许 放 次要位 。 这一阶 , Shell
本、Python 本 crontab调度命令即可完成 单的ETL 务。
下面 一 来看这种ETL的实现方 ,如 6-1 示。
6-1 crontab调度 程
#!/bin/sh
export SPARK_HOME=/usr/local/spark-2.1.1-bin-hadoop2.6
export JAVA_HOME=/usr/local/jdk1.8.0_162/
export PATH=$JAVA_HOME/bin:$PATH
/usr/bin/python /home/userprofile/work/main_workflow.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import datetime
import os
if len(sys.argv) < 2:
today = datetime.datetime.today()
oneday = datetime.timedelta(days=1)
yesterday = today - oneday
datestr = yesterday.strftime("%Y%m%d")
else:
datestr= sys.argv[1]
os.system("export PYTHONIOENCODING=utf8")
os.system("export SPARK_HOME=/usr/local/spark-2.1.1-bin-hadoop2.6")
os.system("export JAVA_HOME=/usr/local/jdk1.8.0_162/")
os.system("export PATH=$JAVA_HOME/bin:$PATH")
1) 务调度 行的 况下,难以厘 务 的 赖关 ;
2)不 看当前 行到 一 务;
3)不 看调度 下 务 行的 止消 时 , 这对
化task 是非常重要的;
4)不 记 历 调度 务的 行 况, 这对 化 排
误是非常重要的;
Airflow的官方文 是
http://airflow.apache.org/index.html, 用Airflow 理调度
务的读 可 研读官 文章, 入 解Airflow。
·Task:是Operator的一 实 ,也就是DAG 的一 。
1.WebServer
2.Worker(Celery )
3.Scheduler
整 Airflow的调度由Scheduler负责 , 隔一 时
Scheduler就 有定义完成的DAG 定义 其 的 ,如 有
运行条件的 ,Scheduler就 相应的 务以 Worker
接收。
4.Flower(Celery )
6-4 Airflow安装
1.DAG 务列表
2.DAG调度状
3.DAG有 无环
4.甘特
6-8 DAG调度甘特 ( Airflow官 )
5.DAG 行 本
6-9 DAG调度 行 本( Airflow官 )
6. 行日
6-11 DAG有 无环 示 ( Airflow官 )
画像 的调度 是先 行 计 务, 完后 验 数
据,如 数据 验无误则 送 件, 后 行 计 务,
则 送 败 件, 务暂 。 计 完成并 验后将数据同
步到 务 。 程 一环 有 监控 验 暂 务,
待开 理并 证数据 验后开 后面的调度环 。 程
详细的调度环 见6.2.8 内容。
6.2.6 本实
Airflow , 单 说,task 本是需要被一 调 行的
本,DAG 本是 理task 本 行顺序、 行触 条件的。 Airflow
调度开 主要需要 护的是DAG 本。下面 一 具 的 子来
解。
default_args = {
'owner': 'userprofile',
'depends_on_past': False,
'start_date': datetime(2018, 12, 01),
'email': ['administer@testemail.com'],
'email_on_failure': True ,
'email_on_retry': True,
'retries': 1,
'retry_delay': timedelta(minutes=1),
}
os.environ['SPARK_HOME'] = '/usr/local/spark-2.1.1-bin-hadoop2.6'
sys.path.Append(os.path.join(os.environ['SPARK_HOME'], 'bin'))
dag = DAG(
'userprofile_dag',
default_args=default_args,
description='A userprofile test',
schedule_interval='00 07 * * *')
·depends_on_past:是 赖上 务,即上一 调度 务 行
败时,是 行该 务。可 项包 True False,False表示当前
行 本不 赖上 行 务是 成功;
·start_date:表示首次 务的 行日期;
·retry_delay:表示重新调 行 务的时 隔。
DAG的定义 ,除 入上 的默认
(default_args=default_args) ,还定义 该DAG 本的dag_id为
userprofile_dag,定时调度时 为 早上7 。
两行参数为 本运行的环 变 。
userlabel_task1= BashOperator(
task_id='userlabel_task1',
bash_command='spark-submit --master yarn --deploy-mode client --driver-memory
4g --executor-memory 8g --executor-cores 2 --num-executors 100
userlabel_execute1.py {{ ds_nodash }} ',
dag=dag,
trigger_rule=TriggerRule.ALL_DONE)
userlabel_task2 = BashOperator(
task_id='userlabel_task2',
bash_command='spark-submit --master yarn --deploy-mode client --driver-
memory 4g --executor-memory 8g --executor-cores 2 --num-executors 100
userlabel_execute2.py {{ ds_nodash }} ',
dag=dag,
trigger_rule=TriggerRule.ALL_DONE)
… # 相应用 画像 本的task,这里省略
上面这 本 入 需要 行的task_id,并对DAG进行 实
化。其 对userlabel_task1这 task_id来说,里面的bash_command
参数对应具 行这 task 务的 本,可理解为Linux下提 的
shell命令。userlabel_execute1.py文件为 行加工用 订单 对应
的 本。Trigger_rule参数为该task 务 行的触 条件,官方文
里面该触 条件有5种状 ,一 常用的
为“ALL_DONE” “ALL_SUCCESS”两种。其 ALL_DONE为当上一
task 行完成时,该task即可 行, ALL_SUCCESS为 有当上一
task 行成功时,该task 调 行, 行 败时,本task不 行
务。
“airflow_run>>userlabel_task1”命令为task 本的调度顺
序, 该命令 先 行“airflow_run” 务后
行“userlabel_task1” 务。
6-12 Airflow下用 画像调度
6.2.7 常用命令行
Airflow 可视化界面的方 实现 调度 理的界面操 ,
试 本 界面操 败的时 ,可 命令行的方 调 务。下
面介 几 常用的命令。
从 6-13可以看出,用 画像工程的调度主要可划分为2 ,
包 数据 库进行的 计 ,以及数据写入服务层,下面详细进
行介 。
6-13 主要调度
1. 计
本示 如下:
# 上 务的task
airflow_start_run = BashOperator(
task_id='airflow_start_run',
retry_delay=timedelta(minutes=5),
retries=10*12,
bash_command='python /airflow/myscripts/userprofile/airflow_start_run.py',
dag=dag)
# 计 的task
userlabel_task1 = BashOperator(
task_id='userlabel_task1',
bash_command=' spark-submit --master yarn --deploy-mode client --driver-memory
1g --executor-memory 2g --executor-cores 2 --num-executors 20 userlabel_task1.py
{{ ds_nodash }} ',
dag=dag,
trigger_rule=TriggerRule. ALL_SUCCESS)
计 完成后, 验当 的 出是 正常,当 验 后
进行 出到服务层的 务, 则 务 败重试 务挂 。
2.数据写入服务层
服务层 接 方 调用 务需 的用 数据。下面 两
应用 景。
数据监控预警整 来看 盖下面几 主要 。
服务层数据监控预警:数据从数据 库 出提 到服务层时,该
程 是 正常进行,一 对比数据 库(Hive) 务 的
数 务 (如MySQL、Hbase、csv文件 ) 对应的 务 的
数 进行监控。
下面详细介 这两 监控预警的表 设计 应用 景。
6.3.1 监控预警
监控预警主要用 证 日用 加工的正常进行,当
的数 覆盖用 况出现 动时 触 件报警,开 收到
报警 件后定位 题 的原 并进行 理。
报警 件的 本 描这 监控表当日数据,当 当日的
出 与历 相比出现 程度 动时,可触 警提示。 如男
历 出覆盖用 数 是100万,今 出覆盖的用 是120
万,可视为出现 动。
可设计如下监控表,监控 的 出 况。
该监控表主要记 以下字 :
·labelid: id。
·data_date:数据日期。
·lable_num:该 覆盖的用 。
·label_wave:该 今日 出 与历 相比的 动 况。
如 广 务 的 景 ,该 RESTful API方 读取
HBase 存储的数据, 此 监控预警 验时,需要比对数据同步前
Hive 该 数据 及数据同步后HBase 存储的数据 。首先需要
询Hive HBase 对应 的数据 ,示 代码如下(Python代码):
# 询 Hive 数据
r = os.popen("hive --hiveconf mapreduce.map.memory.mb=8192 --hiveconf
mapreduce.reduce.memory.mb=16384 -S -e\"select count(1) from
dw.userprofile_userlabel_map_all where data_date='"+datestr+"'\"")
Hive_count = r.read()
r.close()
print "Hive_result: " + str(Hive_count)
# HBase 询 导入HBase 数据
r = os.popen("source /etc/profile; HBase
org.apache.hadoop.HBase.mapreduce.RowCounter 'userprofile_"+datestr+"' 2>&1 |grep
ROWS")
HBase_count = r.read().strip()[5:]
r.close()
print "HBase result: " + str(HBase_count)
6-15 务 监控表示 数据
数据插入完成后 这 服务层监控表的Hive数据 同步
后服务层的数据 来判断同步数据是 正常,是 需要 送 警
件。
6.4 ETL 常排
画像 ETL调度的 程 ,难免 到调度 败的 况。
败时,短时 (小时 别)来看对 服务、BI 视分 来
说暂 服务的 还不 , 是对 上实时推荐的 务来说就
带来用 验 差、推荐准确 不 关 到营收的重 。
此 调度 败时, 速定位 败的原 关 。
关 调度 败的原 , 下来, 照排 误方 的 先 来
说,主要包 以下几 方面。
1.资 内存不 导致 败
常 内存不 的 败,日 报
出“java.lang.OutOfMemoryError” 误 。
2.上 数据ETL延 导致 加工 败
4. 本 导致数据加工 败
我 知 一 用 (userid)可 设 上登 ,同一 设
(cookieid)上可 登 用 ,即userid cookieid为 对
关 。 次开 需要从cookieid关 到userid,获取userid的状
时, 略 这两 度 的 对 关 ,未加条件限制。初
始化 数据时, 本 行后 出“看 ”的数据。 ETL
调度两 后,这种直接 对 关 的 误 , 数据 ,
造成 行 败。
此, 排 题时同样要 开 的 是 存 BUG。
5. 上 务变动导致原有 加工 效
对 这种 况应尽 免,需要运营方 上 新的 接前 知
开 。
6.5 本章小
如 说 数据开 日常工 么最重要, 一定就是 护调度
的稳定 。数据稳定 有 障,提 到服务层的数据的质
有 障。本章介 如 用开 ETL工具Airflow进行画像相关 务
的调度工 及出现 题时的排 方 , 数据预警机制 障 的
数据 出、提 的服务的可靠 。
更多书籍访问:www.j9p.com
7章 用 画像 化
开 画像后的 数据,如 是“ ”数据 库 ,并不
挥更 的 务价 。 有将画像数据 化后 更 务方
用。 本章 ,Web端展示的数据 读取 MySQL这 的关 数据
库,MySQL 存储的数据 Hive加工后, Sqoop同步的 集。
·dw.userprofile_attritube_all:存储用 属 度的
。
·dw.userprofile_action_all:存储用 行为属 度的 。
·dw.userprofile_consume_all:存储用 消费 度的
。
·dw.userprofile_riskmanage_all:存储风控 度的 。
·dw.userprofile_social_all:存储社 度的 。
·dw.userprofile_cookielabel_map_all:对 cookieid 上
的 后 出。
·dw.userprofile_usergroup_labels_all:用 分组表。
询应用到 务 下面,对应 id里面的用 数据, 营 效
试 有广 应用。 如 务 对 定的 进行短 营 ,数
据分 师 分 营 效 时,可以 询这 表 该 id下面的用
id数据,进一步分 这 用 后 的 订单方面的表现。
·dw.cookie_feature_event_append:用 特征库表,存储用
一 一次行为带来的 数据,可用 掘用 行为特征及
好。
select cookieid
from dw.userprofile_attribube_all
where data_date = ‘20190101’
and labelid = ‘ATTRITUBE_C_01_001’ # 分区的 主题是 别
limit 10
该 询 ,限制 询的日期分区为当前日期前一 , 询
id为男 用 。
询 如下:
对 存储userid 度的 的表
dw.userprofile_userlabel_map_all,如 已知一 用 的id,可
询出该 用 上带有的全 。
select userid,userlabels
from dw.userprofile_userlabel_map_all
where data_date = ‘20181201’
and userid in (‘44463729’,’4069220’,’20101029’,’54597979’,’19816511’)
询 如下:
关 用 特征库相关数据的 询 应用方 4.5 有详细介
。面 数据分 师 询时, 需要开放出表 及详细字 说明即
可。
7.2 视 与 询
视 与 询功 主要是面 务 用,如 7-1
示。
7-1 平台 视
视 ,层 化 展示 目前已 上 用的全 用
。用 可以层 化 击 , 看 的详细介
。
该 详 页 ,可以 看 属 这一 目下面
的覆盖用 况。
询 ,如 7-3 示, 入用 对应的userid
cookieid,可以 看该用 的属 、行为 、风控属
度的 , 方位 解一 用 的特征。关 如 存储这种数据
, 3.1.3 有介 ,即 将 用 对应的 成map字
,如{‘key1’:‘value1’,‘key2’:‘value2’},进行
存储。
7-3 用 询
7.3 元数据 理
理功 主要是面 数据开 。数据开 开
完 后,需要将 入元数据进行 理,如 7-4 示。
7-4 理– 加
7-5 理– 元数据
7-6 元数据字
7-7 Navicat 看 入的 元数据
7.4 用 分 功
用 分 功 主要是面 务 用。 理、运营、客服
务 应用 时,可 不 看 一 对应的
况,更 可 需要组 来 其 务上对 的定
义。 如:组 “近30日购 次数” 3次 “高 ”“女 ”用
这3 定义目 , 看该 覆盖的用 ,以及该 分
的 度特征。下面介 上的实现方 。
“用 分 ” 下, 击“新建 ” 前已
加的分组(见 7-8),进入详 页可 定义 盖 的 (如
7-9 示)。
7-8 用 定义分
7-9 用 定义分
定义 用 分 时,对 有 计 ,可以 定义
该 的取 范 ,如 7-9 “近30日购 次数” , 务 可
该 的数 。对 分 ,如 7-9 的“ 度” ,
务 该 即可 出包 该 的用 。“ 名
称” “ 描 ”表单用 务 描 该 务上的定义,
方 后 看、应用该 。下面详细介 一下“ 减 ”功 的
应用 。
Web 端, 务方 组 来 视分 、 定
,并 推送到的 务 ; ETL 务时,即 7-9 “数据计
层 ”,首先需要从MySQL 关 数据库 读取 务方 定的
规则,即 的权重 , 后将 规则组 成SQL语句,
Spark 务将对应的 计 出来,写入Hive ; 服务层应用时,即
7-9 “ 出到服务端”,根据不同的 务 ,分别 行对应的数
据同步 本,将上 程 计 出来存储到Hive 的 数据同步
到对应的 务 。
分
提 根据现有用 定用 的功 ,同时 务方
可以从 度(如 、 别、年龄、消费 平 )进一步分 该
用 的特征,从 为 细化运营提 支持。 上一小 讲的用
功 相 , 分 功 首先也需要组 定用 ,不
同 视分 功 支持从 度去分 定用 的
特征, 用 分 功 重的是将 出来的用 推送到 务
,提 服务支持。
7-10 创建需要分 的
创建好目 用 后, “对比 度” 菜单 需要分
该 用 的 度(如 7-11 示), 如这里 的是下单次数
度。“对比 度”列表 的可 也是用 属 、用 行为
目 已 建的 。
7-11 对目 需要分 的 度
好 视分 的 度,下面就可以看到刚 出来的用
度 下单次数上的表现 (如 7-12 示)。
7-12 从 度分 目 特征
除 视分 单 度上的特征, 视分 功
还可以支持同时分 不同 度上的表现。 务 根据
不同 务规则同时创建两 , 后 对比 度,可以从
度上对比分 这两 的特征(如 7-13 示)。
7-13 对比分 两 特征
7.6 本章小
本章介 用 画像 化主要 盖的功 以及这 的
应用 景。用 画像 化是 数据应用到 务服务 的一 重要出
, 务 熟知 务, 对数据不 解。 这种 可视化的方
,方 务 分 用 特征,将分 后的用 推送到对应
务 触 用 ,更方 、 捷 将数据赋 到 务 景 去。本
章 对 功 的详细剖 ,为数据 、运营、客服
务 提 一种 规划 应用 服务的解决方 。
8章 用 画像应用
用 画像 化后就成为 务 分 用 、触 用 的有效工
具,本章从 营分 、 准营 、 化推荐 方面介 用 画像的
应用 景。
8.1 营分
画像 可帮助 务 从 方面进行 营分 。
8.1.1 分
助用 画像,可以对 的 进行分 ,比如说可以 速定
位到爆 ,进一步分 购 爆 的用 度上的特
征。
8-2 平台用 别分布
8-3 平台用 年龄分布
8-4 平台用 分布
8.1.3 分
根据 黑客理论(AARRR) ,如 8-5 示,将 的营收
径 分为 — 册—留存—下单— 播,其 主要是 运
营 负责;用 运营 贯穿接下来的 程;内容运营主要负责生
质的内容来提高用 的黏 ,从 提高留存;主 运营主要负责主营
务的 径, 化 化 ,提高 化率。
8-5 AARRR 及运营重
1) :这是 来 的 动 , 有有 的用 进入平
台, 对这 用 进行 化。 我 知 ,互 新客的获客成
本是比 高的,如 不 的 质 , 有可 既
有获取到质 好的用 。对 这一 ,用 触 的 本分 就是对
用 来 进行分 ,即本 要介 的内容。 不 靠 的
况下, 、 放 对我 的App、Web 更 适。
2) 册: 后,如 用 是 进来就 ,这
对 并 有 么 用。 有 高质 的内容、 适的 功
用 的需 ,用 有进一步 解 的 望, 有 化的下
一步操 —— 册。 此 将用 入平台还是远远不 的,
需要进一步关 用 是 进一步 册 化,从 册 程上看是 存
需要 化的细 。
3)留存:前面我 提 ,新用 的获客成本是比 高的, 此不
可 一 去获取新的 ,同时也需要 用 ,让进来的
用 对 成 赖, 用 需 ,让用 持 不断 来
用我 的 。 此提升留存一方面需要 用 需 ,另一方面需
要 化用 验。 化 程 可 用 分 、 细化运营、将
准内容推送给有特定需 的用 来提高用 对 的 度。
数据可以 用 行为来分 行为可以 用 持 访
、如 这 行为 生。并 用 生命 期的研究,对 默用
进行识别,让运营 运营 对这 用 进行 ;对 用
进行 记,让运营 推送、 放 方 进行用 。
4)营收:用 是收入的前提。 有 完全 用 的需 ,用
认同 的价 , 用 费 化。 要让 持 稳定
运营下去,就需要 一 列运营 让新用 持 费
化,让 用 持 费。 用 运营的 础是对用 解、
熟 ,数据 的是帮助运营 解用 的 有属 ,让用 不断 营
收进行 化。
5) 播: 有用 对 高度认可及对 功 高度 赖,
将 分 推荐给其 。 分 推荐的 程 ,
的来 , 成 的 环,最终 不断的将用 往营收用
进行 化, 到价 的目的。
对 目 用 的 来 的分 尤为重要。
画像应用 ,可以分 目 的 来 , 放的
略更有 对 。 如, 务 用画像 组 定对 女
装 兴 的 , 度进行 视,分 该 用 主要来
, 后有 对 该 放该女装 的广 。
下面以表8-1 示的 分 度为 进行分 。
·次日留存率= 一 新 的用 二 还登 的用 数/ 一
新 用 数;
从我 关 的 用 留存率来看,一定是 平台上有 消
费行为的用 留存用 , 这 留下来的用 的行为就变
重要。我 需要 解留下来的这 用 么, 方面可以
升留存率。 这方面可以 用运营 ,譬如 动运营 准营
推送 就是有 对 提高留存率的方 。
斗 的主要运用 景有以下几 :
· 务价 径的 化 程 ,比如常用的AARRR 的价
化 ;
8-8 用 展示
8-9 特征分
8.2 准营
8.2.1 短 / 件营
日常生 我 常 从许 接收到营 来的 。一条关
包到账的短 消 推送可 用 开已 访 的
App,一条关 单里面 降价的 件消 推送可 刺 用
开推送 接直接下单购 。
这 营 是如 助画像 实现的 ?
如 公司 初创阶 , 有 力 入 、接 层面的开
时,也可以 数据分 师写Hive SQL语句,组 用 出
对应的用 数据。 后将该 用 相关数据给到对应 务 ,
将数据导入到 三方平台后以短 、 件 方 进行营 。
8.2.2 效 分
准营 是数据价 的一 重要出 , 如 评 效 好 ,不
同 务 的 有不同的关 重 。 来看,可分为 提升导
GMV提升导 两种 况。
有的 务 的KPI 是 , 此关 的重 是 提
升,如负责Push 务 的 。这种 况下,对效 的分 对比
用 定 进行 准推送方 带来的 击率,与 有 用用 画像进
行无差别普 推送带来的 击率相比是 有 提升、提升 少 百
分 。
下面分别 两 进行说明。
1:对目 准消 推送带来 提升
电 负责 运营的 给用 推送消 , 进用 平
台的 度。 用画像 前 给用 的消 为无差别推送,
有 对用 行为特 推送消 , 消 推送的 击 化率一直
7%上下 动。
画像 上 后, 务 用 定用 ,根据用 属
行为特征将用 划分到不同的 去, 对这 分别 文
后进行推送。 如, 近×日 览 女装 且近×日有 来
访的用 ,给这 用 推送女装营 的消 。 助这种 细化推
送 的方 显著提高 整 用 验, 消 推送的 击 化率
到10%左 ,如 8-10 示。
运营 根据 动的目 营 , 用画像 组 用
定 后推送到短 送平台。 短 送后的几日内, BI报
表 监 营 用 的访 、下单 况,如 8-11 示。 动 束后
计 现本次短 准营 给GMV带来 显著的提升。
画像 去 方面的数据分 、触 用 的运营方 ,可
以 速 将数据应用到服务层(T+1甚至实时即可上 应用), 到用
用 馈后 效 分 , 代营 略 设计。相比
的项目制, 项目 理提需 、上 版本, 后进行效 分 、
代再 化的时 期将 短。
9.1 风控 诈预警
9.1.1 应用 景
风控 诈预警 戏、电 、 融、家政、社 领 有
着广 的应用 景, 如家政领 识别 风险、 贷风险的用
,提高从 质 准入 ; 融领 识别存 风险、
贷的 题用 ,对其 绝放贷;电 领 识别出薅 、下
单 收 行为存 常的用 ,对其进行隔离 理。这 应用 景
可以 用 画像来实现。下面 融领 的 风控 诈 来
介 。
消费 融领 对 用 贷前准入有着严 的审核,对 用
、设 建立画像, 助画像数据 风控 略规则、
,进 生成完 的审 略,对 高风险用 进行有效识别,帮助
减少 工参与环 ,实现 动化审 、授 ,有效规 营 、
易的风险( 9-1)。
9-1 画像 贷 务 景的(示 数据)
9.1.2 用 画像切入
当一 用 申请 贷时,接 入用 id 设 id
, 服务层 (一 用HBase) 询对应的用 设 id
( 9-2),生成用 风控报 ( 9-3) 设 风控报 助
务 进行审核 根据风控规则进行 动化放贷 理。
1)不同内容 题对 的 ;
1.对AB组 切分
2. 试文 题对 的方
平台 运营 为 动期 更 用 来访App,计
划 动预 期 取少 用 一版文 题的AB效 试。
该 试方 ,控制组A 取 近x 来访 、cookie尾号为a,
且近x 内 览/收藏/加购 该零食的用 ,给该 用 推送零 文
A,对照组B 取 近x 来访 、cookie尾号为b,且近x 内 览/
收藏/加购 该零食的用 ,给该 用 推送零食文 B。控制组
对照组的用 相同, 文 不同,后 监控两组 的 击率
小,进 分 不同文 对用 击的 。
该 试方 ,控制组A 取 近x 来访 、cookie尾号为1,
有 目 好的用 ,对照组B 取 近x 来访 、cookie尾号为2,
且近x 内 览/收藏/加购 该零食的用 。对AB组用 消 推
送相同的文 ,后 监控两组 的 击率 小,进 分 准营
推送带来的 小。
9.2.3 效 分
AB组 消 推送上 后,后 需要搭建监控报表来监 控制
组 试组的 化 况(如 9-4 示)。
9-4 A/B组效 监 报表
·成熟期:用 常 用 ,并 以分 的 来宣
,此时用 的价 比 高。
这两 目 我 将其 解为如下 ,如表9-1 示。
表9-1 化核 解
用 的生命 期,我 可以将用 的 解如下,如 9-5
示。
9-5 用 生命 期 用 示
与用 生命 期的 阶 对应的关 ,如表9-2 示。
表9-2 用 生命 期关 解
=用 生命 期内下单次数×客单价× 利率
用 生命 期 务 主要有以下几 应用 景。
应用一:根据 解 为提升LTV制定不同的运营 略
从 解公 来看,运营需要 的是尽可 证 的质 ,确
进来的用 的有效 ,提升用 的质 及数 ,尽 降低获取用
的成本,并应用 样化的运营 提升用 化; 用 生命 期
的 阶 ,对不同 的用 进行 原 分 ,提升用
度。
应用二:评 用 运营 动是 盈利
设一 用 月的收入是20元, 月的 率为
50%, 用 播5次,被 播 的 用 月的收入为5
元, 月的 率为70%,则
CLTV=20×1/0.5+5×5×1/0.7=41.43元。
ROI= 化率×ARPU/(CAC+COC)
(1)提高 化率
提高 化率,一 开 ,二 。 谓开 , 的是要不断
种方 来获取新用 , 的是减少 的用 及挽
即将 已 的用 。这里主要介 。 主要从以下两
出 来最 化 减少用 。
a)从 出 , 具 的研究 , 有 离 的用 预警
是无 义的。首先我 要 现有的 出用 是 一步
的,再 具 的 进行改进。比如,是 一 环 生 退
的 况, 就推动 解决 退的 题;再如,是下单 化 程
琐、支 单一, 就推动 程 化、支 样化。
如,前面我 分 用 的生命 期 有关 用到的 化率
的关 ,从这 公 来看, 关 的 化率, 出
化率比 小的 ,定位原 进行 化。 一 具 应用的 子,
的 册率差不 , 不同 的下单 化率差 比
,此时用设定风控规则来评 的质 , 为这 是 册
来 费的, 现是有 刷单, 对刷单的 止 后,
整 的下单 化率就上来 。
(2)提高ARPU
(3)降低成本
降低成本分为两 。
根据上面对用 生命 期核 的 解,对 用 生命
期 一环 的划分,可以从以下几 度着 。
9-11 用 生命 期延 略
前面对用 生命 期 阶 的分 (见表9-3),需要对不
同阶 的用 取不同的运营 略进行触 。
表9-3 用 生命 期 阶 的分
· 入期: 对已安装 未 册的用 导其 册, 对已 册
未下 单的用 导其下单。对 该阶 的用 ,可 消 推
送、站内广 推送 触 , 短用 购 时 隔,实际 可
包、 券的方 励用 短从安装到 册、 册到首次下单
的时 隔;
·成 期: 分 可以看出一 新用 首次购 1 月内 有
购行为的其留存率 有19%,1 月内有 购行为的留存率 到60%
以上。 此阶 需要 养用 的 用习 , 短用 购 时 隔,
刺 其 购。可 消 推送、站内广 推送 触 ;
1.分 用 特征
9-12 视分 用
2. 触 用
根据前面 讲, 生命 期不同阶 可 不同 (消 推
送、站内 、短 、 件 )来触 用 。画像 的用 分 功
支持 组 好用 , 后以 种方 触 到用 (详见
7.4 ),如 9-13 示。
9-13 触 用
3.分 营 效
画像 端 定用 后,将对应的 id写入到Hive相应表
。数据分 师可以从Hive表提取相应数据分 营 效 。
此 , 触 用 (包 消 推送、弹窗、推荐、短 、
件、电话 呼 )的 程 ,不同 的触 成本是不一样的,
触 用 时一方面需要 虑营 成本;另一方面需 排除 同时
触 用 ,给用 造成骚 的 况。 这 是可以 用 画像
排重功 进行控制的。
9.3.4 应用
一:消 推送新安装用 提高用 册率
二:短 营 新 册用 提高下单率
三:用 全生命 期营
为分 触 不同阶 用 利益 , 务 对用 状 3 分
组, 分组分别设 控制组 对照组, 不同分组的弹窗展现
来 试 (如 9-14 示)。
进一步根据运营 略 画像 定好 ,并 推送到对
应的 务 (如 9-15 示)。
9-15 助画像 定
务 画像 组 用 定 并推送到广
,进一步 ERP的广 根据创建的 ID 号 对应的弹
窗、落 页、文 材(如 9-16 示)。
9-16 不同组用 弹窗入 (示 片)
AB组 上 运营后,BI分 师 报表 日监 不同
的 化 况。 分 ,有弹窗用 详 页 化率、加购 化
率、下单 化率、购 化率 方面表现 好 无弹窗用 组(如
9-17 示)。
9-17 报表 用 化(示 表)
试,用 的 务 决定对不同阶 用 用
首页广 弹窗这一 略来提高用 化率。
9.4 高价 用 实时营
9.4.1 项目应用 景
平台运营 为 进高价 新用 的留存,制定 运营规则
——“首日 册的新用 ,如 其 册当日消费 100元则对其进行短
营 ,短 附有平台 送 包的 接”。
9-18 实时 调用方 设计
9.4.3 HBase应用 景小
本 我 用HBase存储用 实时数据, 画像实 应用
HBase 景下 可 为服务层提 接 服务, 来说HBase可
存储离 数据 实时数据 上接 调用( 9-19)。
·实时写入:SparkStreaming/Flink实时消费Kafka 存储的 上
数据, 单 理后写入HBase , 接 实时调用HBase 数据
运营用 。本 讲的高价 用 实时营 就是一种实时写入的应用
景。
9-19 数据写入HBase 景
本 介 实时写入HBase的 景,下面再看一种离 写入
HBase的 景。
运营 画像 出 其运营条件(如 规则A则触
推送 券)的用 ,将该 分 推送到 上营 (
如推送到HBase表usergroup_HBase )。
9.5.1 景
平台上 消 牌 家 日常 运营客 程 现,目前
消 同质化严重, 牌 竞 ,虽 用 购率 高 是
诚度 低,用 普 对 动的敏 度 。 此,可 对 消
牌的易 ,定期 短 准触 目 用 , 导其进行
购。
9.5.2 画像切入及其应用效
家 助画像 进行短 营 定目 用 的时 ,主
要从以下几 方面 虑建立 务规则:
上面的 短 进用 的 购,同样可 短 营 用
推送 购 。 如, 次我购 到石家庄的机票,一 儿就
收到一条租 的营 短 ( 9-22),短 文 明 突出
这几 内容:①目的 有租 服务功 ;②租 的日最低费用;③租
券已到本 账 。对 有 飞机目的 市 驾出行需 的用
来说,这条短 是一条有用的 。
9-21 消 的营 短
9-22 出行 的营 短
用用 画像 ,从 适的时 适的 适的
对目 客 进行营 ( 9-23)。
9-23 准营 客 的
9.6 Session行为分 应用
9.6.1 关 用 行为分
用 行为分 是 获 站访 本数据的 况下,对有关
数据进行 计、分 ,从 现用 访 站的规 ,并将这 规
与 络营 略 相 ,从 现目前 络营 动 可 存 的
题,并为进一步 正 重新制定 络营 略提 据。
1.黏
9-25是带平 曲 的散 ,显示的是近60 访 的用 的
最近一次访 离当前时 的 隔 数的用 分布, 表示的是最
近一次访 的 隔 数, 表示的是对应 隔 数的用 比 ,从
可以直观 看出 时 隔对应的用 况, 用 的
生命 期来看,我 可以将访 数 10 的用 定义为 默用
。可 对这 分用 细分看用 为 隔这么 有访 ,比如看
最后一次访 看 么内容, 对这 用 的特征进行分 ,
将 准 质的内容推送给这 用 看挽 的用 比率, 取 分
用 进行调研,寻 的 分可以 化。
9-25 用 访 期示
2.参与度
我 以定义登 ( 站)即称 为 来 , 登
( 站)来 , 时 分 可以 分为日 (日 用 ,DAU
—Daily Active User)、 ( 用 ,WAU—Weekly Active
User)、月 (月 用 ,MAU-Monthly Active User),一
用DAU/MAU来 为 站的 开率 ,该 越 说明
站的 开率越高。
用 的分 主要有对比分 及细分。对比分 主要可以看时
变化趋势及竞 数据对比。这 分 比 直观 映 的用
趋势,也 比对 己 同 的 致 况,以 更
好 制定 下一步的目 及 。如 DAU有一 时 明显,此
时并不是数 越 越好,需要细分看这 用 的留存及其 化 况。
为 有可 是 动 一 用 , 这 用 具 质 如 ,需
要进一步分 。
表示用 参与度的另 两 是用 的 留时 及用 的访
页面数。为 么要用这两 来表示用 的参与度 ? 为用 的
留时 可以 接 映 页对用 的 程度,可以 接 映 是
用 的需 及 页面的设计是 理。对 盈利 来
说,其目 就是 化,让用 下单,如 用 下单前的 页面
, 这 用 就 有完成 化。从 9-27来看,用 有 页面
A、B、C, 到 目 页,完成 化。则用 页面A的 留时 为
用 离开页面A的时 –用 进入页面A的时 ,用 到 目 页前共
访 3 页面,这3 页面分别是页面A、页面B、页面C。
9-27 用 访 页面示
3. 化
9-28 用 参与度示
分 用 的 化 况可以从两 的方 着 ,一是从 的整
运营 况来看,用 从 到下单的整 程;二是从细分 的
关 径来看,用 接触 到完成 化 历的步骤,这 已
8.1.4 详细 。下面就 一 应用 景进行 说明。
9.3 我 列 运营 景 的 有 化 ,如 9-29
示。
对这 关 的数据监控,我 可以从整 及细分 、
细分时 、细分 动来看不同的 化 况,如表9-2 示。 出有
题的 化 。比如细分 的 景下, 设 是 用
费,从 两 进来的用 后 的 化行为如表9-4 示, 是来评
判这两 的质 劣, 同 用 的 况下,我 应 么判
断 ?
9-29 用 化 一览
表9-4 质 监控
设 用 为10000 ,将 化 的 化为成本绝对
,如表9-5 示。
表9-5 成本监控
显 ,从成本的角度来说, 1要 2。当 ,后 我
也需要分 不同 进来的用 的ARPU,看整 的营收 况, 评
的整 质 。
9.6.2 景
这里首先 一 典 的 景来介 用 访 Session分 应用的
景。
9-30 用 访 行为
Session 记 用 么时 , 么样的行为, 览
么页面/ 。一 Session的切割为 定时 ,如定义App端
Session的切割时 为5分 时,即用 次访 行为如 离上一次
访 行为 5分 内,则记为同一次访 ,如 离上次访 5
分 则记为两次不同的访 。 session_id可 识用 的访 ,同
一次 访 的session_id相同, 则不同。
表9-6 Session分 特征库
下面 介 如 取用 首次访 的Session。
这里有一 记 用 击行为日 的底层
表‘ods.click_event_log’表,从该表 对当日访 的新用 当日
访 时 正排序,取 一次访 时 对应的sessionid,即是用 首
次访 的行为记 。示 代码如下:
select cookieid,
sessionid
from ( select cookieid,
eventtime,
sessionid,
row_number() over(partition by cookieid order by eventtime
asc) as rank
from ods.click_event_log # ODS层 击事件表
where data_date = "data_date" # 当 日期分区
and is_newuser = 1 # 判断是新用
and cookieid is not null
and cookieid <> ''
) t
where t.rank = 1
group by cookieid,sessionid
9-31 Session分 特征数据 示
下面 对用 访 径进行分 的实 来介 。
// 创建SparkSession
val spark = SparkSession
.builder()
.AppName("FirstSessionAnalysis")
.config("spark.testing.memory","2147480000")
.master("local[*]")
.getOrCreate()
// 读取原数据 下单用
val peopleRDD =
spark.sparkContext.textFile("C:\\Users\\king\\Desktop\\cookiesession.log")
.map(_.split(",")) // RDD[Array[String]]
.map( row => Row(row(0),row(1),row(2),row(3),row(4))) // RDD[Row]
// 表
val schemas = "cookie,event,ispaid,data_date,time".split(",")
.map(fp => StructField(fp, StringType))
val schema = StructType(schemas)
// 创建视
spark.createDataFrame(peopleRDD, schema).createOrReplaceTempView("people_feature")
spark.sql("select * from people_feature").show(20,50)
·cookie:用 id。
·data_date:访 日期。
·time:本次行为事件的时 。
用
首访的Session数据,可以 掘用 集 时 访
、集 访
事件是 、主要 行为事件后 出 访 、
行为事件 进 最后下单、访 时 与访 的 加是 进下单
度的内容。
下面 对 用 首访Session进行 掘分 的 来介 ,
Scala代码示 如下。
spark.createDataFrame(rowRdd, sct)
.createOrReplaceTempView("v_tmp_session")
// 看 理后的数据
spark.sql("select * from v_tmp_session").show(20, 40)
·cookie_id:用 id。
·startTime:用 本次Session开始访 时 。
·endTime:用 离开本次Session的时 。
·visitnum:本次Session访 的行为事件数 。
用 首访Session行为事件分 示 如 9-33 示。
9-33 用 首访Session行为事件分
除 以上 度的分 ,还可以进一步从用 的访 时 、访
隔 其 度 入 掘用 访 特征。
Session分 还可以 到用 行为 径, 径分 记 用
次访 的顺序, 可以 观察 一关 前后的
进入 况。 化关 分,可以提升这
的 化效率。
spark.createDataFrame(rowRdd, sct)
.createOrReplaceTempView("v_tmp_session")
9-34 用 前5次访 径
9-35 用 访 Session
从 9-36可以看出未购 用 分时 览Home主页面,其
次 是 详 页, 首购 购用 分时 详 页,其
次是 目页面。由此建议 对未购 用 访 的页面 用 好,
提 更 用 兴 的 。未购 用 有6%访 购物 页面,与
购 用 占比相同,建议 购物 页面 加“ 减 券/再购xx元包
” 提 ,以减少有购物 的用 的 。
9-36 用 session访 页面分布(示 数据)
9.7 效 监 报表搭建
9.7.1 景
务方 应用画像 进行 营 时, 运营
希望 动收到监 报表来 诉 己目前应用 务
的后 访 、下单 化 况,以 对运营 略有 化调
整, 运营更加有的放矢。 是画像 的开 面 务方
搭建 一套 效 监 的 动化报表。
9.7.2 理
搭建 监 报表时,主要分为两 阶 ,首先从相关的Hive
表 提取数据,关 分 成一 宽表, 后整理好一 Excel报表
,最后 动报表 件 定时 Hive 务,将数据插入到Excel
报表 后 动 送。
下面 一 次 解 环 的实现方 。
1.数据提取
负责对接用 主动 呼营 的运营 , 画像 上
到 务 后,后 需要进一步监控该 分 的访 、下单
化 况。
根据 务方 定的规则, ‘10003’‘10004’创建后上 到
件营 (见 9-37)。
9-37 务方 定目 用 呼
9-38 Excel报 动化 程
原始数据表:是用 存放 次 报 需关 数据的 表,
一 用HQL语言 初步的数据 及数据预 理(如 、排序、离
散、 换 )从数据库 提取出来;
从数据 表到数据 化表
9-39 Excel原始数据表
一步,设 日期控制单元
助日期控制单元我 可以 看目 日期的数据, 用
控制可以 动调整相应数据列变化。
9-40 日期控制单元控件
9-41 “设 控件 ”对话
9-42 数据 表 的日期
9-43 日期控件的 用
二步,从原始数据表动 用数据
这里我 Excel函数从原始数据表 取报 需的 分数
据, 取的时 ,由上步骤的日期控制单元 控制。时 度可
根据 务需要进行调整。这里我 详细讲解数据动 用 涉及的函
数。
·reference:是 移的 , 为 移 的 用区 , 须为对
单元 相 单元 区 的 用;
·rows:是 移的行数(其 正数表示 下 移,负数表示 上
移,0表示不 移);
·height:是 要 的 用区 的行数;
·width:是 要 的 用区 的列数。
当 参数是正数的时 ,单元 用区 是以 位移
单元 为左上角。如 不 改变 用区 的 小, 、 参数可
以省略。 单元 入公 后需要同时 下Shift+Ctrl+Enter ,组
完成 入, 入后 显示公 用 号 来,此时表示公
效 。如 9-44 示。
9-44 OFFSET函数的 用方
当记 日报 数据时,数据是从行上不断 下 加的, 以应
定单元 的上方。
INDEX(array,row-num,column-num)
·array:表示要 数据的区 ,其 为单元 区 数
组;
·row-num:要 数据 的行号;
·column-num:要 数据 的列号。
9-45 INDEX函数的 用方
MATCH函数可 单元 区 搜 定项, 后 该项 单元
区 的相对位 。该函数的 如下:
MATCH(lookup-value,lookup-array,match-type)
·lookup-value:表示要 的 。
·lookup-array:表示要搜 的单元 区 。
三步,报 的 报文字
9-46 MATCH函数的 用方
9-47 组 报文字及对应数据
用TEXT函数可将数据 化成 定的 。该函数 如
下:
TEXT ( ,“数字 ”)
· :是单元 内存放的原始数据;
步,制 关 表
更多书籍访问:www.j9p.com
9-49 报 正文展示内容
9.7.3 动报表 件
为 减少重 工 ,数据提取 可以 用Python 动化 本
定时 务。将写好的HQL语句放入Python 本 ,并 服务 上设
crontab定时调度 务, 证 定时 动从数据 库 提取数据后,
将 集写到Excel 并 送 件到数据需 方的 。Python 本代
码示 如下(auto_email.py):
#coding: utf-8
search_data = """ 创建 时表 询昨日运营数据"""
report_data = ''' select * from 上一步创建的 时表 '''
import psycopg2
import smtplib
import os
import openpyxl
import datetime
from impala.dbapi import connect
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import pyhs2 # Hive环
wb = openpyxl.load_workbook('/home/path/username/daily_report_v1.xlsx') # 开服
务 存储 径下的Excel文件
# 接Hive环
impala_conn = pyhs2.connect(host='10.xx.xx.xx', port=xxx, authMechanism="PLAIN",
user='username', password='password', database='dwd')
seo_h5_1 = impala_conn.cursor()
h5_result = impala_conn.cursor()
seo_h5_1.execute('''SET mapreduce.job.queuename=root.yydata''')
seo_h5_1.execute(search_data) # 行HQL语句
# 取出数据
h5_result.execute(report_data) # 取出数据
h5_result = h5_result.fetchall()
#放到sheet里面去
sheet = wb.get_sheet_by_name('daily_report') #daily_report表
# 除历 数据
for i in range(2,sheet.max_row + 1 ):
for j in range(1,sheet.max_column + 1 ):
sheet.cell(row=i,column=j).value = ''
# 充 数据
for i in range(2,len(h5_result) + 2 ):
for j in range(1,len(h5_result[i-2]) + 1 ):
sheet.cell(row=i,column=j).value = h5_result[i-2][j-1]
#关 Hive 接
impala_conn.close()
wb.save('/home/path/usernamet/daily_report_v1.xlsx') # 存Excel文件
receiver = 'receiver_email@xxx.com' # 收件
date_str = datetime.datetime.strftime(datetime.date.today()-
datetime.timedelta(days=1),'%m%d')
mail_txt = """
Dear All,
附件是 监 日报,请 收。
"""
msgRoot = MIMEMultipart('mixed')
msgRoot['Subject'] = unicode(u'日报-%s' % date_str) # 加日期
msgRoot['From'] = 'sender_email@xxx.com'
msgRoot['To'] = receiver
msgRoot["Accept-Language"]="zh-CN"
msgRoot["Accept-Charset"]="ISO-8859-1,utf-8"
msg = MIMEText(mail_txt,'plain','utf-8')
msgRoot.attach(msg)
att = MIMEText(open('/home/path/usernamet/daily_report_v1.xlsx', 'rb').read(),
'base64', 'utf-8')
att["Content-Type"] = 'Application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="日报2017%s.xlsx"' % date_str
msgRoot.attach(att)
smtp = smtplib.SMTP()
smtp.connect('mail.address.com')
smtp.login('sender_email@xxx.com', 'sender_password')
for k in receiver.split(','):
smtp.sendmail('receiver_email@xxx.com', k, msgRoot.as_string())
smtp.quit()
9.8 用 特征库 目
9.8.1 景
前面章 的 是 电 务数据 建的用 特征库,这
里介 另一种 医疗 务 景下 建的用 特征库及其应用方 。
表9-7 医疗 景用 行为 表
根据 务需 ,从用 行为 表 取相关的 准用 。
select userid
from dw.peasona_user_tag_relation
where data_date >= '20190101'
and data_date <= '20190106'
and (eventtype = '1' #用 诊医生诊断疾病
or eventtype = '2' #用 诊评价 写疾病
or eventtype = '3') #用 诊医生擅 疾病
and (tagname like '% 冒%' or tagname like '% %' or tagname like '%
痛%')
景2: 动期 ,平台要 对 医院的一 重 科室医生
营 相关医疗服务,需要 准 取一 近期 该医院 诊 的用 。
select userid
from dw.peasona_user_tag_relation
where data_date >= '20190101'
and data_date <= '20190106'
and tagtype = '4' # 为医院
and tagname = 'xxxx 医院'
and eventtype = '5' #用 诊医生对应医院
9.9 本章小
本章 10用 画像 务 景 实际应用的 讲解 用 画
像 消 推送营 、A/B 效 试、用 生命 期营 、用 VIP
专属客服 景 的应用。9.7 讲解 如 搭建报表 画像 推
送 务 的 数据 务上的应用效 。
文 记 :
摘要记 :
变更记 :
1 言
1.1 项目名称
×××用 画像及其应用
1.2 项目 景及 要
互 步步入 数据时代后,不可 免 给 用 行为
带来一 列改变与重 ;其 最 的变化莫 ,用 的一切行为
面前 是“可视化”的。随着 数据 术的 入研究与应用,
的专 日益 样利用 数据来为 细化运营及 准营 服
务,进 入 掘 的 价 。 是,用 画像的 也就应运
生。
1.3 项目目
包 础 与分 知识 ,实现用 特征全貌刻画。
(2) 种封装角度
分用 别、 内容、 务 景进行封装 。
二、接 数据实时推送
三、展现UI封装
用 画像,将推荐 应用端进行可视化展现,集
动运营,实现千 千面的运营效 。
1.4 项目适用范
2)运营分 :从事市 竞 分 、用 需 分 、 务分
工 ,主要负责用 需 的 现 目 确定,并 运营 划 评
的实施。
2.1 功
2.2
画像 分 主要分原始数据 计分 、 计 建 分
、 预 分 3 分,具 如下:
3 需 设计
3.1 用 画像
【需 说明】用 画像 是 用 本属 分 ,对用 的
互 行为特征进行描 ,包 用 登 、搜 、关 、消费 方
面数据,对用 的疾病 诊、行为 好变化、消费订单 全 程的记
,以 方 展示 用 的 化特征,画像是 分 的
,是 数据 掘的 始。
【 务要 】用 画像 照数据内容 分为:用 属
、行为属 、资 消费、疾病 诊、用 好、客 度6
。
【核 描 】核 包 分 、分 、时 序列
分 、RFM 、推荐 、关 分 。
(1) 分
分 将看 无序的对象进行分组、归 ,以 到更好 理解
研究对象的目的。 要 组内对象相 高,组 对象相
低。 用 研究 , 题可以 助 分 来解决,比如用
度行为 、用 消费 况 。
(2)分
分 是 照 种 准给用 贴 ,再根据 来区分归 ,分
是事先定义好 别, 别数不变。根据用 的文化观 、订单消
费、行为习 的不同细分新的 别, 根据用 的不同制定 牌
推广 略 营 略,将资 对目 用 集 用。
(3)时 序列分
(4)RFM
RFM 为动 显示 一 用 的全 轮廓,R表示用 购
的时 有 远,F表示用 时 内购 的次数,M表示用 时 内
购 的 额,加权 到RFM 分。
(5)推荐
(6)关 分
关 分 就是 关 数据 其 , 存 项目集
对象集 的频 、关 、相关 , 掘
的行为 消费关 特征。
3.1.1 属
【需 说明】 属 是用 的 本 ,这 往往是
用 册及 用 时记 的 ,如年龄、 别、 册时 、婚姻
状况、 高 重 。 属 刻画, 到对用 初步认知的目
的。
【 务要 】 属 分可从数据 库 直接获取,
分数据(生理)可 、疾病 方 非 数据 提 。
3.1.2 行为属
【需 说明】行为属 是 用 用 程 生的
,包 登 行为,挂号、 诊、协议 方、 险 订单以及平台
击、 览、关 、搜 、评价 互 行为数据, 础 计分
解用 的行为 期、习 好、关 内容 。
【 务要 】行为属 主要 订单以及前端的 数
据的 础 计分 获取,详细内容及 径如下:
3.1.3 疾病 诊
【 务要 】疾病 诊 主要 分 挂号 诊订单以及
疾病关 数据,提取用 疾病及 诊需 的 务 ,详细内容
及 径如下:
3.1.4 订单消费
【需 说明】订单消费 是用 平台 用 程 进行
购 消费 的 , 分 务订单及消费数据 掘用 的消
费特征,以 为用 提 对 服务。
3.1.5 用 好
【需 说明】用 好 是用 平台 用的一种 好
特征 习 ,重 分 用 常用 、 诊 、就医 好、用
加关 内容。
【 务要 】用 好 从用 的终端 、 诊方 、历
就诊医生 、就诊医院 、用 击关 分 用 的
特征,具 如下:
3.1.6 客 度
【需 说明】客 度 是用 用 程 的
现,主要从用 用 后的 馈 况以及用 的 风险进行
评 。
【 务要 】客 度 从用 历 是 有 诉 、主动
评价包 差评数据以及 子建 评 风险,具 如下:
3.2 接 封装
【需 说明】用 画像接 旨 解决用 画像数据与 务
应用的 题, 用 画像 应用时 化展现,
并且 证数据运营及营 推荐数据实时更新,数据 日更新, 免数
据不准确 重 叉应用。
3.3 UI设计
【需 说明】数字化运营及 准营 的可视化展现,是 用
画像数据实现千 千面的展现效 , 运营及营 有更好的用
认识,带来更 的用 服务质 。
(1)画像数据展现
(2) 务 计
(3)用 分 力
(4)用 特征雷
(5) 况 表盘
(6)用 关 及搜 疾病 词云
3.4 景应用及项目排期
4.1 络与硬件设