用户画像知识点补充——多数据源

引入

针对用户画像项目来说(产品)必须要支持从多种数据源加载业务数据,构建用户标签。

在之前的标签模型开发中,主要是为了简化开发复杂度,业务数据统一存储到HBase表中。

        数据源包含如下几个方面:

        存储HDFS文件系统

        存储Hive表

        存储HBase表

        存储MySQL表

        存储NoSQL数据库:Redis数据库、MongoDB数据库

        存储Elasticsearch索引库

        存储Kafka分布式队列

        封装数据为RDD:

val offsetRanges = Array(
// topic, partition, inclusive starting offset, exclusive ending offset
OffsetRange(“test”, 0, 0, 100),
OffsetRange(“test”,1, 0, 100),
)val rdd = KafkaUtils.createRDD[String, String](sparkContext, kafkaParams, offsetRanges, PreferConsistent)

        封装数据为DataFrame:

// Subscribe to multiple topics, specifyingexplicit Kafka offsets
val df = spark
.read
.format(“kafka”)
.option(“kafka.bootstrap.servers”, “host1:port1, host2:port2”)
.option(“subscribe”, “topic1, topic2”)
.option(“startingOffsets”, “””{“topic1”:{“0”:23,”1”:-2},”topic2”:{“0”:-2}}”””)
.option(“endingOffsets”, “””{“topic1”:{“0”:50,”1”:-1},”topic2”:{“0”:-1}}”””)
.load()
df.selectExpr(“CAST(key AS STRING)”, “CAST(value AS STRING)”)
.as[(String, String)]

用户数据多种数据源

进入正题,先说明一下我们的用户画像:

1)、面向业务的用户标签及用户画像管理中台

统一规范的标签可视化管理中台,业务人员可自助生产和维护标签,适应营销策略变化。

2)全端采集用户行为数据,整合业务数据等多种数据源,帮助企业构建体系化用户标签图书馆,输出用户画像,赋能业务实现用户精细化运营和精准营销。

具体功能说明

1)、构建用户价值体系

实现用户召回等精准营销目标

用户在平台消费几次后,一段时间内没有再次访问平台进行消费,我们需要对其进行流失召回。

2)、输出全景用户画像

管理客户全生命周期、有效提升用户体验

用户群体的特征属性和偏好概况,使用产品的方式是否和预期一致;为精准营销做有效的数据支撑

3)、利用用户标签形成用户分层

提供个性化推荐内容,持续提升用户转化

用户在平台的消费金额达到一定的级别时,根据其消费能力不同,投其所好的推荐不同价格定位的商品。

4)、利用智能算法,快速找到相似似人群

补充标签定制的不足,高效锁走目标人群

选定种子人群,根据特征在更大范围内为每个用户计算相似度,精准找到相似人群,挖掘更多潜在客户

数据源概述

针对用户画像标签系统来说,不同标签(业务标签,4级标签)来源于不同的业务数据(订单相关数据、搜搜数据、广告点击数据等)、用户行为数据以及第三方数据(社交数据、信用数据等)构建而来。

不同类型数据采集存储在不同的存储引擎系统(比如HDFS、HBase、Hive、Elasticsearch、MYSQL数据库等),因此需要用户画像标签系统可以支持从不同的数据源读取业务数据,进行构建标签,恰好Spark SQL支持多数据源的加载与保存。

 

加载HBase表

前面的标签开发中,无论是加载注册会员信息表tbl_tag_users还是订单数据表tbl_tag_orders,都是从HBase数据库中读取,自己依据Spark SQL实现外部数据源接口,在标签管理平台构建标签时,通过标签规则rule传递参数,开发标签模型时:解析标签规则获取业务数据,逻辑如下:

 

重构代码(加载数据)

将上述代码抽象为两个方法:

其一:解析标签规则rule为Map集合

其二:依据规则Map集合中inType判断具体数据源,加载业务数据

编写MetaParse对象object,创建方法parseRuleToMap和parseMetaToData

  1. 、解析规则rule为参数ParamsMap

获取业务标签规则rule,按照分隔符分割数据,具体实现代码如下:

import org.apache.spark.internal.Logging
import org.apache.spark.sql.{DataFrame, SparkSession}/*** 加载业务数据工具类:*      解析业务标签规则rule,依据规则判断数段数据源,加载业务数据*/
object MetaParse extends Logging {/*** 依据标签数据,获取业务标签规则rule,解析转换为Map集合* @param tagDF 标签数据* @return Map集合*/def parseRuleToParams(tagDF: DataFrame): Map[String, String] = {import tagDF.sparkSession.implicits._// 1. 4级标签规则ruleval tagRule: String = tagDF.filter($"level" === 4).head().getAs[String]("rule")logInfo(s"==== 业务标签数据规则: {$tagRule} ====")// 2. 解析标签规则,先按照换行\n符分割,再按照等号=分割/*inType=hbasezkHosts=bigdata-cdh01.itcast.cnzkPort=2181hbaseTable=tbl_tag_logsfamily=detailselectFieldNames=global_user_id,loc_url,log_timewhereCondition=log_time#day#30*/val paramsMap: Map[String, String] = tagRule.split("\n").map{ line =>val Array(attrName, attrValue) = line.trim.split("=")(attrName, attrValue)}.toMap// 3. 返回集合MapparamsMap}/*** 依据inType判断数据源,封装元数据Meta,加载业务数据* @param spark SparkSession实例对象* @param paramsMap 业务数据源参数集合* @return*/def parseMetaToData(spark: SparkSession,paramsMap: Map[String, String]): DataFrame = {// 1. 从inType获取数据源val inType: String = paramsMap("inType")// 2. 判断数据源,封装Meta,获取业务数据val businessDF: DataFrame = inType.toLowerCase match {case "hbase" =>// 解析map集合,封装Meta实体类中val hbaseMeta = HBaseMeta.getHBaseMeta(paramsMap)// 加载业务数据spark.read.format("hbase").option("zkHosts", hbaseMeta.zkHosts).option("zkPort", hbaseMeta.zkPort).option("hbaseTable", hbaseMeta.hbaseTable).option("family", hbaseMeta.family).option("selectFields", hbaseMeta.selectFieldNames).option("filterConditions", hbaseMeta.filterConditions).load()case "mysql" =>// 解析Map集合,封装MySQLMeta对象中val mysqlMeta = MySQLMeta.getMySQLMeta(paramsMap)// 从MySQL表加载业务数据spark.read.format("jdbc").option("driver", mysqlMeta.driver).option("url", mysqlMeta.url).option("user", mysqlMeta.user).option("password", mysqlMeta.password).option("dbtable", mysqlMeta.sql).load()case "hive" =>// Map集合,封装HiveMeta对象val hiveMeta: HiveMeta = HiveMeta.getHiveMeta(paramsMap)// 从Hive表加载数据, TODO:此时注意,如果标签模型业务数从Hive表加载,创建SparkSession对象时,集成Hivespark.read.table(hiveMeta.hiveTable)// def select(cols: Column*): DataFrame,   selectFieldNames: _* -> 将数组转换可变参数传递.select(hiveMeta.selectFieldNames: _*)//.filter(hiveMeta.whereCondition)case "hdfs" =>// 解析Map集合,封装HdfsMeta对象中val hdfsMeta: HdfsMeta = HdfsMeta.getHdfsMeta(paramsMap)// 从HDFS加载CSV格式数据spark.read.option("sep", hdfsMeta.sperator).option("header", "true").option("inferSchema", "true").csv(hdfsMeta.inPath).select(hdfsMeta.selectFieldNames: _*)case "es" =>nullcase _ =>// 如果未获取到数据,直接抛出异常new RuntimeException("业务标签规则未提供数据源信息,获取不到业务数据,无法计算标签")null}// 3. 返回加载业务数据businessDF}
}

(叠甲:大部分资料来源于黑马程序员,这里只是做一些自己的认识、思路和理解,主要是为了分享经验,如果大家有不理解的部分可以私信我,也可以移步【黑马程序员_大数据实战之用户画像企业级项目】https://www.bilibili.com/video/BV1Mp4y1x7y7?p=201&vd_source=07930632bf702f026b5f12259522cb42,以上,大佬勿喷)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【应用层】 DNS 域名协议解析

文章目录 DNS(Domain Name System)出现及演化 ⏳DNS 概括🔍DNS定义DNS 作用 DNS工作原理⚙️域名解析DNS解析的详细工作流程 DNS域名解析方式🔄静态DNS域名解析动态DNS域名解析 DNS域名解析过程的深入分析 🧐递归查询迭代查询 公共DNS服务器的…

Tailwindcss Flex 布局相关的样式类及其实战案例

007 Flex布局相关的样式 flex-basics 相关的样式类 ClassPropertiesbasis-0flex-basis: 0px;basis-1flex-basis: 0.25rem; /* 4px */basis-2flex-basis: 0.5rem; /* 8px */basis-3flex-basis: 0.75rem; /* 12px */basis-4flex-basis: 1rem; /* 16px */basis-5flex-basis: 1.2…

docker-comopse容器因依懒关系无启动解决方法

1、确认出影响项目开机自启的容器 通docker logs -f 确认容器是否正常docker restart 重启容器,如果项目正常,把异常容器加入rc.local中,待开机一定时间后,重启此容器。 2、在rc.local中添加延时重启对应容器 #vim /etc/rc.loc…

STC8增强型单片机进阶开发--LED呼吸灯(PWM)

知不足而奋进 望远山而前行 文章目录 目录 文章目录 前言 目标 内容 PWM基础概念 STC8H芯片 PWMA应用 PWM配置详解 周期 占空比 模式 使能PWM 引脚配置 EAXSFR扩展寄存器 总结 前言 学习PWM(脉宽调制)是探索数字信号转模拟信号的重要一步,尤…

ad18学习笔记21:焊盘设置Paste Mask Expansion(锡膏层延伸)

在pcb上放置焊盘的时候,可以对焊盘进行设置,可以用默认的规则,可以用自定义的规则,网上很少看到自定义的规则怎么用。 参考了官方的说明文档,我只是稍微补充了一下 paste mask与solder mask有哪些区别_paste mask与s…

文件上传之使用一个属性接收多个文件

在开发过程中&#xff0c;可能遇到这样的业务&#xff1a;文件上传时个数不定&#xff0c;这样我们不能枚举出所有的文件name&#xff0c;这种情况下我们可以使用一个name将所有的文件接收下来&#xff1b; html代码 <!DOCTYPE html> <html lang"en"> …

终于更新了!时隔一年niushop多商户b2b2c的新补丁v5.0.2终于发布了,一起看看有啥新变化

注意这是最新版的V5.02_多商户V5.0.2版本更新说明 瞧瞧更新了什么内容&#xff0c; 优化功能 优化手机号、身份证等常用验证规则&#xff0c;全局化处理优化商品列表接口查询速度 修复功能修复系统内部分图片上传功能调用接口跨端口问题修复总后台和商家后台订单管理搜索标签在…

Ubuntu上安装Conda步骤

按照官方文档下载并安装miniconda脚本 https://docs.anaconda.com/free/miniconda/ mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda…

一文彻底讲透 PyTorch

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

JQC-3FF-S-Z 继电器模块使用(arduino)

前言 继电器模块可以控制电流的接通和非接通状态&#xff0c;和开关一样。实际上是用小电流去控制大电流运作的一种“自动开关” 本文只是简单使用继电器模块做一个 led 点亮和熄灭的案例&#xff0c;结合案例可以和 nodemcu 等板子结合做出远程控制开关。 材料准备 杜邦线…

无限可能LangChain——构建一个简单的LLM应用程序

在本快速入门中&#xff0c;我们将向您展示如何构建一个简单的LLM应用程序。该应用程序将文本从英语翻译成另一种语言。这是一个相对简单的LLM应用程序——它只是一个LLM调用加上一些提示。尽管如此&#xff0c;这仍然是开始使用LangChain的好方法——只需一些提示和一个LLM调用…

小波相干性显著性检验(MATLAB R2018A)

交叉小波常被用于检测不同信号之间的相关性&#xff0c;其在时频域建立了不同信号之间的联系。对于两个时域信号&#xff0c;其交叉小波变换和交叉小波尺度谱如下&#xff1a; 以轴承振动信号为例&#xff0c;利用正常轴承与故障轴承的振动信号、故障轴承和故障轴承的振动信号分…

C编程惯用法:深入剖析与实战指南

C编程惯用法&#xff1a;深入剖析与实战指南 在C语言编程的浩瀚海洋中&#xff0c;掌握一些惯用法对于提升代码质量、增强可读性以及降低出错率至关重要。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;详细剖析C编程中的惯用法&#xff0c;帮助您更好地理解和应…

Java开发-面试题-0002-ArrayList 和 LinkedList的区别

Java开发-面试题-0002-ArrayList 和 LinkedList的区别 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文) 生活公众号:好锅(Life is more than code) CSDN: CodeZeng1998 其他平台…

【sklearn | 1】sklearn 基础教程

scikit-learn&#xff08;简称 sklearn&#xff09;是一个基于 Python 的机器学习库&#xff0c;广泛应用于数据挖掘和数据分析。它提供了各种分类、回归和聚类算法&#xff0c;以及工具用于模型选择和数据预处理。本文将详细介绍 sklearn 的基本使用方法和功能。 安装 scikit-…

【JavaEE进阶】——Mybatis操作数据库(使用注解和XML方式)

目录 &#x1f6a9;三层架构 &#x1f388;JDBC操作回顾 &#x1f6a9;什么是MyBatis &#x1f6a9;MyBatis⼊⻔ &#x1f388;准备工作 &#x1f4dd;创建⼯程 &#x1f4dd;数据准备 &#x1f388;配置数据库连接字符串 &#x1f388;写持久层代码 &#x1f388;单…

用Python实现一个Lisp解析器

一、模块代码 Talk is cheap, show the code: # lisp.pyimport rescanner re.Scanner([(r\s, None),(r[^"()\s]|"[^"]*", lambda scanner, token: (NAME, token)),(r\(, lambda scanner, token: (token, token)),(r\), lambda scanner, token: (token, …

插入排序(直接插入排序、折半插入排序、希尔排序)的性能分析

目录 前言 插入排序 直接插入排序性能分析 折半插入排序性能分析 希尔排序性能分析 前言 本篇文章主要是总结插入排序的性能分析&#xff0c;具体的概念、算法、排序过程&#xff0c;我前面的文章有写&#xff0c;在这里就不再过多赘述了。 插入排序 插入排序是一种简单直…

【2024】LeetCode HOT 100——技巧

目录 1. 只出现一次的数字1.1 C++实现1.2 Python实现1.3 时空分析2. 多数元素2.1 C++实现2.2 Python实现2.3 时空分析3. 颜色分类3.1 C++实现3.2 Python实现3.3 时空分析4. 下一个排列4.1 C++实现4.2 Pyth

如何从Windows的硬盘中恢复丢失或删除的照片

你有没有不小心删除了一张你再也找不回来的重要照片&#xff1f;如果是您的公司或家庭照片、婚礼或童年回忆&#xff0c;或亲人的照片怎么办&#xff1f; 根据我们的经验&#xff0c;用户通常会在清理计算机的存储/速度时遇到这样的事故&#xff0c;并最终删除包含重要图片的文…