精华内容
下载资源
问答
  • RestCloud数据集成平台提供多数据源的统一在线管理能力,可以集中管理企业所有数据链接信息,可以同时链接多个环境多个版本的数据源,支持SQL、NOSQL、MQ等数据源的链接和连通测试。 为什么选择RestCloud数据集成...

    RestCloud数据集成平台提供多数据源的统一在线管理能力,可以集中管理企业所有数据链接信息,可以同时链接多个环境多个版本的数据源,支持SQL、NOSQL、MQ等数据源的链接和连通性测试。
    为什么选择RestCloud数据集成平台?
    众多企业的系统数据往往分散在多个业务系统中进行存储和管理的,数据存储类型多样且复杂(DB、文件、MQ、API等),而端到端的业务场景往往需要在多个业务系统之间实现数据的实时同步和准确传输从而实现业务操作的连贯性。
    通过数据集成平台企业可以实现主数据的汇聚分发、业务系统数据的抽取、清洗、补全并准确的传输到业务所需要的地方,通过数据集成平台企业可以实现那里需要数据,平台就能实时准确的传输到位,从而可以快速支撑业务能力创新。


    数据集成平台功能
    云原生架构、多租户支持
    支持主流SQL及NOSQL间同步
    全新Web在线拖拽构建数据任务
    支持容器化部署,弹性伸缩
    支持大规模的分布式部署架构
    满足上万流程的同时调度与并发运行
    超过100+数据处理组件
    支持连接多种数据库
    数据集成平台通过可视化的拖、拉、拽即可完成数据集成流程的构建并实现数据抽取、转换、清洗、脱敏、加载等功能。RestCloud ETL从架构、易用性、传输性能、可视化、功能丰富性等方面均全面超越主流开源ETL工具。

     

    展开全文
  • Java的数据计算类库RowSet提供了JoinRowSet和FilteredRowSet类,可以进行跨库的关联计算,但是有很多局限。首先,JoinRowSet只支持innerjoin,不支持outter join。其次,db2、mysql和hsql经过测试是可以使用...

    Java的数据计算类库RowSet提供了JoinRowSet和FilteredRowSet类,可以进行跨库的关联计算,但是有很多局限。首先,JoinRowSet只支持inner

    join,不支持outter join。其次,db2、mysql和hsql经过测试是可以使用JoinRowSet的,但是oracle

    11g和其他数据库关联的的时候虽然不报错,但是结果集为空。而oracle11g的两个数据库用户跨库做join,使用JoinRowSet可以得到正确的结果。所以说不同数据库厂家提供的Jdbc实现可能会影响上述方法的结果。第三,就是编程还是有点复杂。

    集算器esProc能很好配合java完成跨库连接。集算器支持各种数据库,包括:oracle、db2、mysql、sqlserver、sybase、postgresql等,均可完成多数据混合的inner

    join和outter

    join等各种跨库关联运算。下面我们通过例子来看一下具体作法:要将db2中的sales表和mysql数据库中的employee表通过sale.sellerid和employee.eid关联,过滤出state=”California”的所有sales和employee数据。例子虽然是db2和mysql,其他数据库的写法也是类似的。

    Sales表的结构和数据如下:

    a4c26d1e5885305701be709a3d33442f.png

    Employee表的结构和数据如下:

    a4c26d1e5885305701be709a3d33442f.png

    实现的思路是:用Java程序调用集算器脚本,连接多个数据库实现关联和过滤计算后将结果以ResultSet的方式返回给Java程序。

    esProc代码如下:

    a4c26d1e5885305701be709a3d33442f.png

    A1:连接预先配置好的db2数据源。

    A2:连接预先配置好的mysql数据源。实际上对于oracle等其他数据库也同样支持。

    A3、A4:分别从db2和mysql中读取sales序表和employee序表。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。

    A5:使用集算器的对象引用机制,将sales序表和employee序表通过sellerid=eid关联。

    A6:按照state="California"过滤序表。

    A7:生成一个新的序表,得到需要的字段。

    A8:返回给集算器程序的调用者。

    在Java程序中使用esProc

    JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):

    //建立esProcjdbc连接

    Class.forName("com.esproc.jdbc.InternalDriver");

    con=

    DriverManager.getConnection("jdbc:esproc:local://");

    //调用esProc程序(存储过程),其中test是dfx的文件名

    com.esproc.jdbc.InternalCStatement st;

    st

    =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call

    test()");

    //执行esProc存储过程

    st.execute();

    //获取结果集

    ResultSet set = st.getResultSet();

    展开全文
  • 在上一篇文章springBoot+Hibernate多数据源配置与使用讲述了Springboot整合Hibernate实现多数据源配置,这篇文章则讲述了整合mybatis的情况,对于Hibernate,其自带的各类数据库模板操作方法能够很方便快捷的完成...

    在上一篇文章springBoot+Hibernate多数据源配置与使用讲述了Springboot整合Hibernate实现多数据源配置,这篇文章则讲述了整合mybatis的情况,对于Hibernate,其自带的各类数据库模板操作方法能够很方便快捷的完成基本的增删改查功能,特点:简单,快捷,而与之相对应的则是它的灵活性就没那么好了,当需要进行复杂的操作(诸如多表查询),Hibernate就有点捉襟见肘了。反观mybatis,由于其直接使用SQL语句完成程序到数据库的相应操作,无论多么简单的操作,你都得写出其完整的SQL语句,因此显得比较繁琐,而在另一方面,由于直接使用SQL语句完成操作,其灵活性不言而喻。至于选择哪一个框架,则视具体的需求而定。

    一、创建Springboot项目

    创建项目的方式多种多样,可以任意选择,结果都是一样的

    <1>直接登陆Spring Initializer页面,在页面选择项目类型(如Maven Project)、Spring boot版本等,填写项目名,添加依赖后,点击“Generate Project”就会下载一个压缩包。下载后,解压缩,在idea或者eclipse中将其打开即可。

    <2>在idea中新建一个Maven项目,然后添加jar包依赖,在我之前的一篇文章Spring-datatable-Jpa实现增删改查及分页有一个简单的介绍,需要的初学者可以看下。

    <3>在idea中新建一个Spring Initializer项目,一路next,在需要填入项目名的时候,填入即可。

    二、POM.xml

    pom.xml中导入的依赖项即是项目所需要导入的各种jar包,本文所用到的jar包如下:

    org.mybatis.spring.boot

    mybatis-spring-boot-starter

    1.3.1

    org.springframework.boot

    spring-boot-starter-web

    mysql

    mysql-connector-java

    runtime

    org.springframework.boot

    spring-boot-starter-test

    test

    org.springframework.boot

    spring-boot-starter-test

    test

    com.alibaba

    fastjson

    1.2.40

    org.springframework.boot

    spring-boot-devtools

    true

    org.springframework.boot

    spring-boot-maven-plugin

    true

    true

    built标签部分的内容为添加热部署配置,同时还需要加如上标注的热部署依赖jar包,当不需要使用热部署时,这些东西都是不需要的。

    三、项目配置文件

    在看各类配置文件之前,我们先看下项目的目录结构,这样对整个项目有一个直观的了解。

    6291068f130c

    首先,我们来配置application.properties文件,该配置文件可以理解为一个根配置文件,需要在该配置文件中指明下一级的配置文件路径,一般端口,数据源等配置均在该文件中进行配置。本项目有两数据源,因此需要分别配置。项目使用的配置如下:

    mybatis.config-locations=classpath:mybatis/config.xml

    mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

    spring.datasource.primary.driverClassName = com.mysql.jdbc.Driver

    spring.datasource.primary.url = jdbc:mysql://localhost:3306/mybatis1?useUnicode=true&characterEncoding=utf-8&useSSL=true

    spring.datasource.primary.username = root

    spring.datasource.primary.password = root

    spring.datasource.secondary.driverClassName = com.mysql.jdbc.Driver

    spring.datasource.secondary.url = jdbc:mysql://localhost:3306/mybatis2?useUnicode=true&characterEncoding=utf-8&useSSL=true

    spring.datasource.secondary.username = root

    spring.datasource.secondary.password = root

    前两行指明了mybatis的配置文件位置,以及其mapper对应的.xml位置,接下来的是两个数据源的配置,一个database对应一个数据源,若另一个为oracle数据库也是OK的。

    接下来看config.xml文件,其仅作为一个类型的匹配。

    在mapper中的两个.xml文件为java文件夹下的mapper中对应的UserMapper接口,该接口定义一些增删改查语句,并在resources下的mapper文件夹中对应的.xml文件中进行实现,具体内容在下面介绍mapper接口时阐述。

    四、后台功能实现代码

    由于有两个数据源,因此在application.properties文件中数据源的配置不能使用默认的格式,而自写的数据源格式项目肯定是不认识的,因此需要进行额外配置。

    <1>创建配置文件

    在com.spring.mybatisxml包下创建datasource包,存放定义数据源java文件。在datasources包下新建DataSource1Config.class和DataSource2Config.class分别定义两个数据源。

    DataSource1Config.class :

    package com.spring.mybatisxml.datasource;

    import org.apache.ibatis.session.SqlSessionFactory;

    import org.mybatis.spring.SqlSessionFactoryBean;

    import org.mybatis.spring.SqlSessionTemplate;

    import org.mybatis.spring.annotation.MapperScan;

    import org.springframework.beans.factory.annotation.Qualifier;

    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

    import org.springframework.boot.context.properties.ConfigurationProperties;

    import org.springframework.context.annotation.Bean;

    import org.springframework.context.annotation.Configuration;

    import org.springframework.context.annotation.Primary;

    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

    import org.springframework.jdbc.datasource.DataSourceTransactionManager;

    import javax.sql.DataSource;

    @Configuration

    @MapperScan(basePackages = "com.spring.mybatisxml.mapper.mapper1", sqlSessionTemplateRef = "primarySqlSessionTemplate")

    public class DataSource1Config {

    @Bean(name = "primaryDataSource")

    @ConfigurationProperties(prefix = "spring.datasource.primary")

    @Primary

    public DataSource testDataSource() {

    return DataSourceBuilder.create().build();

    }

    @Bean(name = "primarySqlSessionFactory")

    @Primary

    public SqlSessionFactory testSqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {

    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

    bean.setDataSource(dataSource);

    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/UserMapper1.xml"));

    return bean.getObject();

    }

    @Bean(name = "primaryTransactionManager")

    @Primary

    public DataSourceTransactionManager testTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {

    return new DataSourceTransactionManager(dataSource);

    }

    @Bean(name = "primarySqlSessionTemplate")

    @Primary

    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

    return new SqlSessionTemplate(sqlSessionFactory);

    }

    }

    DataSources2Config.class :

    package com.spring.mybatisxml.datasource;

    import org.apache.ibatis.session.SqlSessionFactory;

    import org.mybatis.spring.SqlSessionFactoryBean;

    import org.mybatis.spring.SqlSessionTemplate;

    import org.mybatis.spring.annotation.MapperScan;

    import org.springframework.beans.factory.annotation.Qualifier;

    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

    import org.springframework.boot.context.properties.ConfigurationProperties;

    import org.springframework.context.annotation.Bean;

    import org.springframework.context.annotation.Configuration;

    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

    import org.springframework.jdbc.datasource.DataSourceTransactionManager;

    import javax.sql.DataSource;

    @Configuration

    @MapperScan(basePackages = "com.spring.mybatisxml.mapper.mapper2", sqlSessionTemplateRef = "secondarySqlSessionTemplate")

    public class DataSource2Config {

    @Bean(name = "secondaryDataSource")

    @ConfigurationProperties(prefix = "spring.datasource.secondary")

    public DataSource testDataSource() {

    return DataSourceBuilder.create().build();

    }

    @Bean(name = "secondarySqlSessionFactory")

    public SqlSessionFactory testSqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {

    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

    bean.setDataSource(dataSource);

    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/UserMapper2.xml"));

    return bean.getObject();

    }

    @Bean(name = "secondaryTransactionManager")

    public DataSourceTransactionManager testTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {

    return new DataSourceTransactionManager(dataSource);

    }

    @Bean(name = "secondarySqlSessionTemplate")

    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

    return new SqlSessionTemplate(sqlSessionFactory);

    }

    }

    完成了数据源定义后,接下来便是常规的controller层,entity层,对应数据库的mapper层,此处为简略起见,略掉了service层。由于带有了角色权限,而角色一般就那几个,因此建立enums包,在改包新建AuthorityEnum.class文件如下:

    package com.spring.mybatisxml.enums;

    public enum AuthorityEnum {

    manager,registrant,visitor

    }

    entity实体层,新建User.class文件,内容如下:

    package com.spring.mybatisxml.entity;

    import com.spring.mybatisxml.enums.AuthorityEnum;

    import java.io.Serializable;

    public class User implements Serializable {

    private int id;

    private String userName;

    private AuthorityEnum authority;

    public int getId() {

    return id;

    }

    public void setId(int id) {

    this.id = id;

    }

    public String getUserName() {

    return userName;

    }

    public void setUserName(String userName) {

    this.userName = userName;

    }

    public AuthorityEnum getAuthority() {

    return authority;

    }

    public void setAuthority(AuthorityEnum authority) {

    this.authority = authority;

    }

    }

    controller控制层,新建MainController.class文件,内容如下:

    package com.spring.mybatisxml.controller;

    import com.alibaba.fastjson.JSONObject;

    import com.spring.mybatisxml.entity.User;

    import com.spring.mybatisxml.mapper.mapper1.UserMapper1;

    import com.spring.mybatisxml.mapper.mapper2.UserMapper2;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    import java.util.List;

    @RestController

    public class MainController {

    @Autowired

    private UserMapper1 userMapper1;

    @Autowired

    private UserMapper2 userMapper2;

    @RequestMapping("/all")

    public JSONObject findAll(){

    List users1 = userMapper1.findAll();

    List users2 = userMapper2.findAll();

    users1.addAll(users2);

    JSONObject json = new JSONObject();

    json.put("data",users1);

    return json;

    }

    /*** 数据库1操作 ***/

    @RequestMapping("/find1")

    public JSONObject findOne(Integer id){

    User user = userMapper1.findOne(id);

    JSONObject json = new JSONObject();

    json.put("data",user);

    return json;

    }

    @RequestMapping("/add1")

    public void addOne(User user){

    userMapper1.addOne(user);

    }

    @RequestMapping("/update1")

    public void updateOne(User user){

    userMapper1.updateOne(user);

    }

    @RequestMapping("/del1")

    public void delOne(Integer id){

    userMapper1.delOne(id);

    }

    /*** 数据库2操作 ***/

    @RequestMapping("/find2")

    public JSONObject findOne2(Integer id){

    User user = userMapper2.findOne(id);

    JSONObject json = new JSONObject();

    json.put("data",user);

    return json;

    }

    @RequestMapping("/add2")

    public void addOne2(User user){

    userMapper2.addOne(user);

    }

    @RequestMapping("/update2")

    public void updateOne2(User user){

    userMapper2.updateOne(user);

    }

    @RequestMapping("/del2")

    public void delOne2(Integer id){

    userMapper2.delOne(id);

    }

    }

    对与mapper层,由于有两个数据源,因此需要两个接口文件与之对应,如目录结构所示,新建UserMapper1.interface和UserMapper2.interface,内容分别如下:

    package com.spring.mybatisxml.mapper.mapper1;

    import com.spring.mybatisxml.entity.User;

    import org.apache.ibatis.annotations.Mapper;

    import org.springframework.stereotype.Service;

    import java.util.List;

    @Service

    @Mapper

    public interface UserMapper1 {

    List findAll();

    User findOne(Integer id);

    void addOne(User user);

    void updateOne(User user);

    void delOne(Integer id);

    }

    package com.spring.mybatisxml.mapper.mapper2;

    import com.spring.mybatisxml.entity.User;

    import org.apache.ibatis.annotations.Mapper;

    import org.springframework.stereotype.Service;

    import java.util.List;

    @Service

    @Mapper

    public interface UserMapper2 {

    List findAll();

    User findOne(Integer id);

    void addOne(User user);

    void updateOne(User user);

    void delOne(Integer id);

    }

    在完成了接口后,接下来该关注的就是其实现了。如目录结构所示,在resources文件夹下新建mybatis文件夹,在该文件夹下新建config.xml文件(没错,就是上文提到的,在application.xml文件中配置路径的config.xml文件)和mapper文件夹,在mapper文件夹下新建UserMapper1.xml和UserMapper2.xml文件,以对上述的UserMapper1.interface和UserMapper2.interface进行实现。其内容分别如下:

    id, userName, authority

    SELECT

    FROM user

    SELECT * FROM user WHERE id=#{id}

    INSERT INTO user(userName,authority) VALUES (#{userName},#{authority})

    UPDATE user SET userName=#{userName},authority=#{authority} WHERE id=#{id}

    DELETE FROM user WHERE id=#{id}

    id, userName, authority

    SELECT

    FROM user

    SELECT * FROM user WHERE id=#{id}

    INSERT INTO user(userName,authority) VALUES (#{userName},#{authority})

    UPDATE user SET userName=#{userName},authority=#{authority} WHERE id=#{id}

    DELETE FROM user WHERE id=#{id}

    其中的为扫描对应的接口,不然它怎么知道对应的是哪一个。

    当你完成了上述这些内容的时候,那么就可以见证奇迹的时刻了。看博文可以给你一个整体的理解,以及对某些细节的详解,但是想要完成实现一个项目,看源码往往是很有必要的。

    源码链接

    展开全文
  • 作者|gongyouliu编辑 | auroral-L全文共7942字,预计阅读时间50分钟。大家好,我是强哥。一个热爱暴走、读书、写作的人!本章目录一、推荐系统的数据源 1. ...

    作者 | gongyouliu

    编辑 | auroral-L

    全文共7942字,预计阅读时间50分钟。

    大家好,我是强哥。一个热爱暴走、读书、写作的人!

    本章目录

    一、推荐系统的数据源

        1. 根据产品功能要素来划分

          (1)用户行为数据

          (2)用户画像数据

          (3)物品画像数据

          (4)场景化数据

        2. 根据数据载体来划分

          (1)数据价值

          (2)类别数据

          (3)文本数据

          (4)图片数据

          (5)音视频数据

        3. 根据数据组织形式来划分

          (1)结构化数据

          (2)半结构数据

          (3)非结构化数据

    二、数据预处理

        1. 抽提(Extract)

        2. 转换(Transform)

        3. 加载(Load)

    总结

    推荐系统是机器学习的子领域,跟一般的机器学习算法一样,推荐算法依赖数据来构建推荐模型,有了模型后需要进行模型训练,最终为用户提供个性化的推荐服务(模型推断)。推荐系统由于其解决的问题的特性(推荐系统解决的是信息过滤与资源匹配的问题)以及自身的强业务相关性,构建推荐系统的数据来源及数据处理方式有自身的特点,本章我们就对推荐系统涉及到的数据源及数据预处理相关的知识进行介绍,方便我们在后续章节中构建推荐算法模型。

    一、推荐系统的数据源

    推荐系统根据用户在产品(APP、网站等)上的操作行为,挖掘用户的兴趣点,预测用户的兴趣偏好,最终为用户做个性化推荐。在整个推荐过程中,涉及到的要素有用户、物品、用户的操作行为、用户当前所处的场景等4类。这每类要素都是具备对应数据的。按照这种要素划分,推荐算法可以利用4类数据。另外,根据数据自身的特性,数据也可以分为数值数据、类别数据、文本数据、图片数据、音视频数据等5类。最后,根据推荐系统依赖的数据的组织形式(数据范式),又可以将数据分为结构化数据、半结构化数据、非结构化数据3大类。下面我们分别按照这3种分类方式来详细描述推荐系统所依赖的数据及这些数据的特点。

    1. 根据产品功能要素来划分

    根据数据来源的产品功能要素来分,推荐系统依赖的数据分为用户行为数据、用户画像数据、物品画像数据、场景化数据4大类,见下面图1,下面我们分别介绍各类数据及其特点。

    7cc3293f4743049edd51efdbecd6e7c4.png

    图1:推荐系统依赖的4类数据源

    (1) 用户行为数据

    行为数据是用户在产品上的各种操作行为,比如浏览、点击、播放、购买、搜索、收藏、点赞、评论、转发、加购物车、甚至滑动、暂定、快进快退等等一切操作行为。用户在产品上的操作行为为我们了解用户提供了线索,用户的操作行为也是用户真实意图的反馈。通过挖掘用户行为,我们可以获得对用户兴趣偏好的深刻洞察。

    根据用户的行为是否直接表明用户对物品的兴趣偏好,用户行为一般分为显式行为和隐式行为。显式行为是直接表明用户兴趣的行为,比如点赞、评分等。隐式行为虽不是直接表示用户的兴趣,但是该行为可以间接反馈用户的兴趣变化,只要不是用户直接评分、点赞的操作行为都算隐式反馈,包括浏览、点击、播放、收藏等等。

    用户行为数据是最容易收集、数据量最多的一类数据(因为用户的任何操作行为,我们都可以进行埋点收集)。这类数据需要我们进行收集、预处理才能最终被推荐算法使用。这类数据获取也相对容易,只要我们按照规范进行埋点就能够保证数据范式正确,当然埋点也是需要经验的,目前有很多第三方服务商提供埋点实施方案,在这方面没有经验的企业是可以进行采购的。

    有些产品由于自身特性,往往是很难收集到除了用户行为外的其他数据的(或者即使可以收集到,但是成本太大,比如UGC产生的数据可能就非常脏乱),因此,充分利用用户行为数据对构建高质量的推荐系统是非常关键的。

    目前个人信息保护法正式实施了(2021年9月1日正式实施),另外国家也会开始管控算法业务,未来用户是可以关闭日志收集等相关服务的,这对未来的推荐算法落地是有比较大的挑战的。

    (2)用户画像数据

    用户画像数据是对用户相关信息的客观描述。包含用户自身所带的属性,比如年龄、身高、体重、性别、学历、家庭组成、职业等等。这些数据一般是稳定不变(如性别)或者缓慢变化(如年龄)的。而有些用户画像数据是通过用户的行为来刻画的,通过用户行为给用户打上相关标签,这些标签也成为用户画像的一部分,比如动漫迷、果粉、健身达人等等。

    人类是一个社会化物种,用户的不同属性决定了用户所处的阶层或生活圈层。不同的阶层或生活圈又有不同的行为特征、生活方式、偏好特点,在同一圈层的用户具备一定的相似性,这种相似性为我们做个性化推荐提供了特有的方法和思路(比如基于社交关系的推荐就可以很好利用用户画像相关的信息)。

    另外,通过用户对物品的操作行为,我们可以将物品所具备的特征按照某种权重赋予用户,这些特征就构建了用户的兴趣画像,相当于给用户打上了相关的标签(比如喜欢看“恐怖片”的人)。从这些兴趣偏好出发,我们可以给用户做个性化推荐。

    有些产品由于业务特性是可以很好地收集到用户画像信息的,比如支付宝、微信等需要用户用身份证或者绑定银行卡,这就可以获得比较完整、隐私的用户个人信息了。而有些产品(比如今日头条、快手等),用户不需要注册就可以使用,比较难获得用户自身相关的信息。不管怎样,用户在产品上都会留下行为轨迹,基于这些行为轨迹,我们都可以挖掘出用户行为刻画出的画像特征。

    (3)物品画像数据

    推荐系统中最重要的一个“参与方”是待推荐的物品,物品自身是包含很多特征和属性的。对于商品来说,品类、价格、产地、颜色、质地、外观、品牌、保质期等等都是商品的元数据。如果有关于物品的描述信息(如电影的剧情介绍),我们还可以利用NLP技术从描述信息中提取关键词来作为画像特征。另外,图片、音频、视频中,我们通过深度学习等技术也是可以提取关键词来作为画像特征的。

    物品画像也可以通过用户行为来刻画。比如某个物品是比较热门的物品,我们可以给该物品打上“热门”的标签。某个物品很受某类人喜欢,也可以给该商品打上相关标签,比如“白领专用”。

    (4) 场景化数据

    场景化数据是用户在对物品进行操作时所处的环境特征及状态的总称,比如用户所在地理位置、当时的时间、是否是工作日、是否是重大节日、是否有重大事件(比如双十一)、当时的天气、用户当时的心情、用户所在产品的路径等等。这些场景化信息对用户的决策是非常重要的、甚至是起决定作用的。比如,美团饿了么这类基于地理位置服务的产品,给用户推荐餐厅是一定是在用户所在位置或者用户指定收货地点附近的。

    恰当地使用场景化数据,将该类数据整合到推荐算法中,可以更加精准地为用户进行个性化推荐,产生更好的使用体验和商业化价值。

    按照产品功能要素来划分是一种比较偏业务的划分方式,可以让我们更清晰地看到问题。我们在第三篇中讲解召回算法时,就是按照这4类产品功能要素(即用户行为召回、用户画像召回、物品画像召回、场景信息召回)来展开的。

    2. 根据数据载体来划分

    随着互联网与科技的发展,网络上传输、交换、展示的数据种类越来越多样化,从最初的数字、类别、文本到图片,再到现在主流的音视频,基于这些数据载体的不同,推荐系统建模依赖的数据可以分为5类,见下面图2。

    6ad2a157d7af8ec2681c3527ea63fb31.png

    图2:推荐系统依赖的5种数据载体

    (1)数值数据

    推荐系统算法用到的可以用数值来表示的数据都属于这一类,比如用户年龄、收入、商品价格、配送距离等等。数值数据也是计算机最容易处理的一类数据,基本上是直接可以用于算法中的。其他类型的数据要想很好地被推荐算法利用,一般会先利用各种方法转化为数值数据(我们会在特征工程那一章讲解具体的方法和策略)。

    (2)类别数据

    类别数据是这类具备有限个值的数据,类似计算机编程语言中的枚举值,比如用户性别、学历、物地域、商品品牌、商品尺码等等。类别数据也比较容易处理,一般用one-hot编码或者编号就可以转化为数值型数据。当然如果类别数量巨大,用one-hot编码会导致维度很高、数据过于稀疏等问题,这时可以采用hash编码或者嵌入的方法了。

    (3)文本数据

    文本数据是互联网中数量最多的、最普遍的一类数据,物品的描述信息、新闻文本、歌词、剧情简介等都是文本数据。处理文本类数据需要借助自然语言处理相关技术。比如TF-IDF、LDA等都是比较传统的处理文本数据的方法,当前比较流行的Embedding方法可以获得比较好的效果。

    (4)图片数据

    随着智能手机摄像头技术的成熟,图像处理软件的发展,以及各类APP的流行,拍照和分享照片更加容易了。另外图片比文本更容易传达信息,因此当前互联网上到处充斥着各种图片,图片数据是互联网上的主流数据类型,商品的展示图、电影的缩略图、用户朋友圈的照片等等都以图片的形式存在。

    对于图片类数据的处理,目前的深度学习技术相对成熟,包括图片的分类、对象识别、OCR、图片的特征提取等等,精度已经足够用于产品了,在某些方面(如图片分类)甚至超越了人类专家的水平。

    (5)音视频数据

    音视频数据我们并不陌生,甚至在移动互联网爆发之前都已经存在了很多年了(录音机和摄像机可以记录声音和视频)。但只有当移动网络及软硬件成熟后,以这两类数据为载体的产品才发展壮大。音频类的产品有喜马拉雅、荔枝FM等,视频类除了爱奇艺、腾讯视频、优酷等长视频APP外,目前大火的抖音、快手等短视频应用非常受欢迎。游戏直播、电商导购直播等应用也是视频类数据的输出媒介。音乐的数字化,各类音频学习软件(如樊登读书、得到APP等)也促进了音频数据的增长。

    音视频数据的价值密度小,占用空间多,处理相对复杂,在深度学习时代,这些复杂数据的处理也变得可行了。音频数据可以通过语音识别转换为文字,最终归结为文本数据的处理问题,视频数据可以通过抽帧转换为图片数据来处理。目前比较火的多模态技术也可以直接处理原始的音视频数据。

    图片、音视频数据属于富媒体数据,随着传感器种类的丰富(手机、无人机、激光雷达等)、精度的增强(比如拍照能力越来越强)、相关互联网应用的繁荣(如抖音、快手等都是基于富媒体数据的应用),网络上出现了越来越多的富媒体数据,并且占据了互联网数据的绝大多数,因此是非常重要的一类数据,也是未来的推荐系统需要重点关注的数据。

    按照数据载体来划分数据的好处是方便对数据进行处理,从中提取构建推荐算法需要的特征。我们在第15章讲解特征工程时,就是按照数据的这种划分方式来讲解的。

    3. 根据数据组织形式来划分

    按照数据组织形式不同,不同类型的数据处理起来难易程度是不一样的。人类是比较善于理解和处理二维表格类数据(结构化数据)的,这就是为什么关系型数据库(主要是处理表格类数据)在计算机发展史上具有举足轻重地位的原因。随着互联网的发展,数据形式越发丰富,不是所有数据都是结构化的,有些数据是半结构化甚至是无结构化的(具体见下面图3),下面分别对这3类数据加以说明。

    bf877f7b3f6a3b2102930330d376d6aa.png

    图3:三种数据组织形式

    (1)结构化数据

    所谓结构化数据就是可以用关系型数据库中的一张表来存储的数据,每一列代表一个属性/特征,每一行就是一个数据样本。一般用户画像数据和物品画像数据都可以用一张表来存储,用户和物品的每一个属性都是表的一个字段,因此是结构化数据。下表就是商品的结构化表示。

    商品

    品牌

    价格

    品类

    颜色

    iPhone13 Pro

    苹果

    9888元

    手机

    远峰蓝、石墨色、银色、金色

    尼康 D7500

    尼康

    7299元

    数码

    黑色

    浪琴(Longines)瑞士手表 康卡斯潜水系列 机械钢带男表 L37824066

    浪琴

    13000元

    钟表

    L37824766、L37824566等

    表1:商品画像数据的结构化表示

    结构化数据是一类具备Schema的数据,也就是每一列数据的类型、值的长度或者范围是确定的,一般可以用关系型数据,如MySQL、ProgreSQL、Hive等来存储,这类数据可以用非常成熟的SQL语言来进行查询、处理。

    (2)半结构数据

    半结构化数据虽不具备关系型数据库这么严格的Schema,但数据组织是有一定规律或者规范的,利用特殊的标记或者规则来分隔语义元素或对记录和字段进行区隔。因此,也被称为自描述的数据结构。常见的XML、Json、HTML等数据就属于这一类。

    对于用户在产品上的操作行为,我们一般按照一定的规则来对相关字段进行记录(比如可以用Json格式来记录日志,或者按照规定的分割字符来分割不同字段,再拼接起来记录日志),这类数据也属于半结构化数据,一些半结构化数据是可以通过一定的预处理转化为结构化数据的。

    半结构化数据对推荐系统是非常关键的。推荐系统最终的推荐结果可以采用Json的格式进行存储或者以Json的形式在互联网上传输最终展示给终端用户。很多推荐模型也是采用固定的数据格式存储的,比如ONNX(Open Neural Network EXchange,开放神经网络交换)格式,是一种用于表示深度学习模型的标准,可使模型在不同框架之间进行迁移。

    半结构化的数据一般有比较松散的范式,这类数据也有适合的数据存储工具,一般会用key-value形式的NoSQL数据库存储,比如HBase、Redis、MongoDB、Elastic Search等等。

    (3)非结构化数据

    非结构化数据,是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来存储的数据,也没有半结构化数据这种有一定的规律或者规范。非结构化数据包括文本、图片、各类数据报表、图像和音视频数据等等。非结构化数据由于没有固定的数据范式,也是最难处理的一类数据。

    文本、短视频、音频、商品等都包含大量的非结构化数据。即使物品本身是非结构化的(比如抖音上的短视频),我们也可以从几个已知的维度来定义物品,从而形成对物品结构化的描述,如上面表1中就是针对商品从多个维度来构建结构化数据。

    随着移动互联网、物联网的发展,各类传感器日益丰富,功能多样,人际交往也更加密切,人们更愿意表达自我,人类的社交和生产活动产生了非常多的非结构化数据,非结构化数据量成几何级数增长。

    怎么很好地处理非结构化数据,将非结构化数据中包含的丰富信息挖掘出来,并应于算法模型中,是具备极大挑战的,但是如果利用的好,是可以大大提升推荐算法的精准度、转化率等用户体验、商业化指标的。随着NLP、图像处理、深度学习等AI技术的发展与成熟,我们现在有更多的工具和方法来处理非结构化数据了。推荐系统也享受到了这一波技术红利,在这些新技术的加持下,推荐效果越来越好。

    非结构化的数据由于没有固定的范式,一般可以采用对象存储工具进行存储,如Apache Ozone(https://ozone.apache.org/)等。目前基本所有的云服务厂商都会提供对象存储工具,方便客户存储非结构化的对象文件。

    上面从3个不同的分类角度来介绍了推荐系统的数据源,我们知道了哪些数据是对推荐系统有用的,当我们获取了这些数据之后我们就需要对它们进行适当的预处理并存储下来,方面后续的推荐系统建模使用。下面一节我们来简介介绍一下数据预处理相关的知识点。

    二、数据预处理

    数据预处理一般称为ETL(Extract-Transform-Load),用来描述数据从来源到最终存储之间的一系列处理过程,一般经过抽提、转换、加载3个阶段。数据预处理的目的是将企业中的分散、零乱、标准不统一的数据整合到一起,将非结构化或者半结构化的数据处理为后续业务可以方便处理使用的(结构化)数据,为企业的数据驱动、数据决策、智能服务提供数据支撑。

    数据基础设施完善的企业一般会构建层次化的数据仓库系统,数据预处理的最终目的也是将杂乱的数据结构化、层次化、有序化,最终存入数据仓库。对于推荐系统来说,通过ETL将数据处理成具备特殊结构(可能是结构化的)的数据,方便进行特征工程,最终供推荐算法学习和模型训练使用。下面分别对ETL3个阶段的作用进行简单介绍。

    1. 抽提(Extract)

    这一阶段的主要目的是将企业中分散的数据聚合起来,方便后续进行统一处理,对于推荐系统来说,依赖的数据源多种多样,因此是非常有必要将所有这些算法依赖的数据聚合起来的。推荐系统的数据源比较多样,不同的数据抽取的方式不一样,下面分别简单介绍。

    用户行为数据一般通过在客户端埋点,通过HTTP协议上传到日志收集web服务(如Nginx服务器),中间可能会通过域名分流或者LB负载均衡服务来增加日志收集的容错性、可拓展性。日志一般通过离线和实时两条数据流进行处理。离线数据通过预处理(比如安全性校验等)进入数仓,实时流经Kafka等消息队列,然后被实时处理程序(如Spark Streaming、Flink等)处理或者进入HBase、ElasticSearch等实时存储系统供后续的业务使用。用户行为日志的收集流程见下面图4。

    43f800eea13fe8f46f0cdd28a30bab3d.png

    图4:用户行为日志收集流程(右上角进入DW的属于离线数据,右下角经过Kafka的属于实时流)

    对于用户画像数据、物品画像数据一般是存放在关系型数据库中的,实时性要求不高的推荐业务可以采用数据表快照(按天从业务系统中将数据库同步到Hive中)进行抽取,对实时性有要求的信息流推荐可以采用binlog实时同步或者消息队列的方式抽取。

    场景化相关数据一般是描述用户当前状态的数据,一般是通过各种传感器或者埋点收集的,这类数据也生成于客户端。通过上面图4右下角的实时日志收集系统进入消息队列,供后端的实时统计(如时间序列数据库、ES进行存储进而查询展示)或者算法(通过Spark Streaming或者Flink等)进行处理。

    2.转换(Transform)

    这个阶段是ETL的核心环节,也是最复杂的一环。它的主要目标是将抽取到的各种数据,进行数据的清洗、格式的转换、缺失值填补、剔除重复等操作,最终得到一份格式统一、高度结构化、数据质量高、兼容性好的数据,提供给推荐算法的特征工程阶段进行处理。

    清洗过程包括剔除掉脏数据、对数据合法性进行校验、剔除无效字段、字段格式检查等过程。格式转换是根据推荐算法对数据的定义和要求将不同来源的同一类数据转为相同的格式,使之统一化、规范化的过程。由于日志埋点或者数据收集过程中存在的各种问题,真实业务场景中,字段值缺失是一定存在的,缺失值填补可以根据平均数或者众数进行填补或者利用算法来学习填充(如样条差值等)。由于网络原因日志一般会有重传策略,导致重复数据,剔除重复就是将重复的数据从中过滤掉,从而提升数据质量,以免影响最终推荐算法的效果(如果一个人有更多的数据,那么在推荐算法训练过程中,相当于他就有更多的投票权,模型学习会向他的兴趣倾斜,导致泛化能力下降)。

    3. 加载(Load)

    加载的主要目标是把数据存放至最终的存储系统,比如数据仓库、关系型数据库、key-value型NoSQL中等。对于离线的推荐系统,训练数据放到数仓中,画像数据存放到关系型数据库或NoSQL中。

    用户行为数据通过数据预处理一般可以转化为结构化数据或者半结构化数据,行为数据是最容易获得的一类数据,也是数据量最大的一类数据,这类数据一般存放在分布式文件系统中,原始数据一般放到HDFS中,通过处理后的行为数据都会统一存放到企业的数据仓库中,离线数据基于Hive等构建数仓,而实时数据基于HBase等构建数仓,最终形成统一的数据服务,供上层的业务使用。

    某些数据,比如通过特征工程转化为具体特征的数据,这类数据可能需要实时获取、实时更新、实时服务于业务,一般可以存放在HBase或者Redis等NoSQL中。

    用户画像、物品画像数据一般属于关系型数据,这类数据比较适合存放在关系型数据库(如MySQL)或者NoSQL中。

    对于图片、音视频这类比较复杂的非结构化的数据,一般适合存放在对象存储中。当前比较火的数据湖技术(如Delta Lake、Iceberg、Hudi等)就是希望整合以数仓为主导的传统结构化数据存储与以图像音视频为主的非结构化数据。在数据湖体系下,推荐系统依赖的所有数据源都可以存储在数据湖中。

    总结

    推荐系统是机器学习的一个分支,因此推荐算法依赖数据来构建模型,最终为用户提供个性化的物品推荐。本章简单梳理了推荐系统的数据源及数据预处理相关的知识点。

    推荐系统数据源可以按照3种形式来分类。按照推荐产品功能要素来划分,可以分为用户行为数据、用户画像数据、物品画像数据和场景化数据四类。按照数据载体来划分,可以分为数值数据、类别数据、文本数据、图片数据、音视频数据等5类。按照数据组织形式来划分,可以分为结构化数据、半结构化数据与非结构化数据。

    当我们获得了各类不同的、可以用于推荐系统模型构建的数据,我们还需要将这些数据收集、转运、预处理并存储到数据中心。当所有的数据都准备就绪了,后面我们才可以基于这些数据去构建算法模型。我们会在后续章节具体介绍推荐系统相关的算法模型。

    我出版的畅销书《构建企业级推荐系统:算法、工程实现与案例分析》,可以跟这个系列文章一起阅读,大家有需要可以点击下面链接购买。

    240291d718a3159b934e858f1faf0d71.png

    展开全文
  • 文 | 洪九(李戈) | 知乎个性化推荐系统的出现为处理信息过载问题提供了一个有效的工具,已经成为互联网各大平台(电商、信息流等)的标配,并在技术(个性化召回、个性化排序等)上取得了长...
  • 金融、电信、零售、医疗、保险等数据密集型领域,都已经开展了大数据相关的研究和应用,尝试从大数据挖掘价值、获取洞察,从而有效地协助组织降低风险、提高效率和创造价值,为产业的发展和转型提供支撑。...
  • 中国土壤学会土壤生物和生化专业委员会暨土壤生物多样性与生物化学过程研讨会(第二轮通知)来源:中国土壤学会土壤生物和生化专业委员会更新时间:2021-05-12 原文链接:http:/...
  • 传统方式是数据集成(ETL)后再做分析,但目前需求在变化,数据源也在变化,数据集成系统越来越庞大,导致响应变化的速度越来越慢,逐渐出现灵活度低、过程复杂、难以管理等问题。针对这样的困境,企业需要一种能更...
  • 微生物群落多样性测序与功能分析微生物群落测序是指对微生物群体进行高通量测序, 通过分析测序序列的构成分析特定环境中微生物群体的构成情况或基因的组成以及功能。 借助不同环境下微生物群落的构成差异分析我们...
  • 1、 概述 不夸张地说,系统的运行过程就是处理数据的过程,数据的...在配置文件中通过一些属性(spring.datasource.*)可以控制数据源的配置,比如: spring: datasource: url: "jdbc:mysql://localhost/test" us
  • 点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!最新研究表明,用于图像识别任务的卷积神经网络往往表现出一致的“对抗缺陷”:对抗攻击算法可以生成很小的输入噪声误导这些模型,并且...
  • 点击上方 "云祁QI"关注,星标或置顶一起成长如今,随着诸如互联网以及物联网等技术的不断发展,越来越多的数据被生产出来。据统计,每天大约有超过2.5亿亿字节的各种各样数据...
  • 数据增强 | 小综述

    2021-12-11 01:21:40
    每天给你送来NLP技术干货!作者|太子长琴整理|NewBeeNLP数据增强(Data Augmentation, DA)缓解了深度学习中数据不足的场景,在图像领域首先得到广泛...
  • 阿里云DataWorks数据集成(DataX)架构&实践分享 分享嘉宾:罗海伟阿里云 编辑整理:约理中国科学院大学 目录 阿里云DataWorks数据集成(DataX)架构&实践分享 ▌为什么需要数据集成 数据集成的应用...
  • 1、什么是数据仓库?权威定义:数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。1)数据仓库是用于支持决策、面向分析型数据处理;2)对多个异构的数据源...
  • 数据

    2021-03-16 13:45:33
    一、简介 (一)概念 元数据是描述数据数据,主要用于...元数据可以整合整个业务的工作流、数据流和信息流,使得系统不依赖特定的开发人员,从而实现系统可扩展。 (三)历史 传统针对数据的管理,包括几类: 1.数
  • 数据湖概念数据湖最早是由Pentaho的创始人兼CTO,James Dixon,在2010年10月纽约 Hadoop World大会上提出来的。当时Pentaho刚刚发布了Hadoop的第...
  • 作者|友创云天来源|http://t.hk.uy/bt5数据湖概述数据湖这一概念,最早是在2011年由CITO Research网站的CTO和作家Dan Woods首次提出。其比喻是:如...
  • 2020年数据术语的故事

    2021-01-21 00:00:00
    点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源2020年整个技术圈子要说话题最多的,应该是大数据方向。新感念层出不穷,数据湖概念就是其中之一。这篇文章是关于数据仓库、数据湖、...
  • 作者 |友创云天来源 |http://t.hk.uy/bt5数据湖概述数据湖这一概念,最早是在2011年由CITO Research网站的CTO和作家Dan Woods首次提出。其比喻...
  • 什么是稀疏数据

    2021-10-21 15:21:40
    在现代社会中,随着信息的爆炸式增长,数据量也呈现出爆炸式增长,数据形式也越来越多样化。在数据挖掘领域,常常要面对海量的复杂型数据。其中,稀疏数据这一特殊形式的数据正在越来越为人们所注意。 稀疏数据绝对...
  • 数据仓库元数据管理

    2021-10-30 20:13:51
    数据仓库元数据管理一、元数据简介二、Atlas简介三、安装配置1.安装依赖2.安装步骤四、Hive血缘关系导入 一、元数据简介 元数据(MetaData)狭义的解释是用来描述数据数据。广义的来看,除了业务逻 辑直接读写...
  • 之前在多源关联分片报表中验证了各个报表工具的多数据源关联功能,这些产品都能支持多数据源,但对不同类型数据源的支持程度并不一样。目前常用的关系型数据库基本上都提供 jdbc 接口,所有报表工具都支持,这里就不...
  • 点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源先随便扯一扯2020年中期的时候,数据湖这个概念应该开始频繁的进入大家的视线了。很多兄弟都没有搞懂数据湖的概念的时候就开始吹了。...
  • 1.分区2....表的垂直切分:可以分到多库中,不遵守范式表的水平切分:解决单表数据量太大的问题、提高了稳定和负载能力、应用端改造少无论那种切分缺点都有分布式事务、节点join、跨节点合并排序分...
  • 作者|太子长琴整理|NewBeeNLP数据增强(Data Augmentation, DA)缓解了深度学习中数据不足的场景,在图像领域首先得到广泛使用,进而延伸到 NLP 领...
  • 转自我的语雀:https://www.yuque.com/docs/share/4a3838e2-f63d-4c00-8842-0bcd881516eb?# 《论文:大数据的数据接入和数据服务技术的研究-已发表》
  • ↑↑↑关注后"星标"Datawhale每日干货&每月组队学习,不错过Datawhale干货来源:数据派THU,编辑:数据Seminar 本文约10500...
  • 数仓建模-实现OneData经验数据治理问题数据孤岛:各部门、产品、业务的数据相互隔离,难以通过共性ID打通重复建设:重复的开发、计算、存储,带来高昂的数据成本数据歧义:指标定义口径不一致...
  • 来自人工智能(AI)/机器学习(ML)、区块链、传感器、5G网络、联网汽车等新兴数据源驱动着这股增长浪潮,随之而来的是日益增长的对于高效、可靠的存储的需求,而HDD和SSD无疑是未来存储的主力军。据IDC预测,至2025...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,290
精华内容 23,316
热门标签
关键字:

数据源多样性