Spark+ES+ClickHouse 构建DMP用户画像
Posted 居高声自远,非是藉秋风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark+ES+ClickHouse 构建DMP用户画像相关的知识,希望对你有一定的参考价值。
环境搭建
环境搭建
- 环境搭建
- 一、数据上传到hdfs
- 二、创建临时内部分区表
- 三、创建外部压缩表
- 四、数据插入到临时表
- 五、数据从临时表插入到外部压缩表
- 六、删除临时表
- 七、hive创建hbase表的映射关系
- 八、hbase表创建
- 九、hive插入数据
- 十、springboot创建
- 十一、springboot逆向工程
- 十二、springboot整合hive
- 总结
一、数据上传到hdfs
hdfs dfs -rm -r $data_path
hdfs dfs -mkdir -p $data_path
hdfs dfs -put
l
o
c
a
l
f
i
l
e
p
a
t
h
p
r
o
f
i
x
local_file_path_profix
localfilepathprofixcol
d
a
t
a
p
a
t
h
p
r
o
f
i
x
data_path_profix
datapathprofixcol_path“/”$dt
提示:一般是使用flume
二、创建临时内部分区表
drop table if exists tmp.dim_product_tmp;
CREATE TABLE IF NOT EXISTS tmp.dim_product_tmp (
item_sk int comment '代理健',
item_id string comment '商品id',
cate int comment '商品分类',
brand int comment '商品品牌',
a1 int comment '商品属性1',
a2 int comment '商品属性2',
a3 int comment '商品属性3'
)COMMENT '商品维度表'
partitioned by (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
location 'hdfs://node01:9000/test4/data/dim_product/';
内部表:为了删除表的同时删除数据
location:与数据路径一致,为了添加分区的时候可以使用相对路径
飘号在shell中是命令函数的意思,会优先执行; hive建表需要考虑到关键字问题,尽量不使用关键字。
三、创建外部压缩表
drop table if exists ods.dim_order;
CREATE external TABLE IF NOT EXISTS ods.dim_order (
order_sk int comment '代理键',
order_id string comment '订单id',
user_id string comment '用户id' ,
final_total_amount decimal(16,2) comment '总金额',
finish_time string comment '完成时间',
finish_time_hour string comment '完成时间(小时)'
)COMMENT '订单维度表'
partitioned by (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC
location 'hdfs://node01:9000/test4/ods/dim_order'
TBLPROPERTIES('orc.compress'='snappy');
存储格式:ORC
压缩格式:snappy
内部表和外部表区别: 建表语句是否使用到了 external 。 对于内部表删除后数据也会消失,外部表数据不会消失;业务上更多使用外部表。 location内部外表表都可以使用;使用了location 表位置在location位置,否则是在默认的位置。 对于load 会移动数据, insert into 会新增一份数据;对于add partition 不会复制数据
分区中的location可以使相对路径或者是绝对路径;不加/代表是相对路径;
四、数据插入到临时表
alter table $table_name drop if exists partition (dt=' $dt');
alter table $1 add if not exists partition (dt='$2') location '$3';
五、数据从临时表插入到外部压缩表
insert overwrite table ods.dim_product select * from tmp.dim_product_tmp where dt='2023-02-06';
六、删除临时表
drop table if exists ods.dim_order;
七、hive创建hbase表的映射关系
drop table if exists ods.dwt_user_tags_map_all;
CREATE EXTERNAL TABLE ods.dwt_user_tags_map_all(
user_id string comment '用户id',
user_tags map<string,string> comment '用户标签聚合'
)COMMENT '用户标签主题表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
map keys terminated by ':'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,tags:user_tags")
TBLPROPERTIES("hbase.table.name" = "user_tags_map_all")
和测创建HBASE表映射之后,hive表新增数据后HBASE会同时新增数据
八、hbase表创建
create ‘t20’, ‘c1’, SPLITS => [‘0000|’,‘0001|’,‘0001|’, ‘0002|’, ‘0003|’, ‘0004|’]
预分区:HBASE创建表的时候要先预分区。
1.|ascll编码中是最大的,也就是说0000开头的都会落入到这个分区
2.rowkey设计原则:唯一,16位,散列,可溯源;concat(‘000’,ceil(rand()*10)%5,substr(md5(user_id),0,12))。使用md5加随机前缀的形式散列rowkey
九、hive插入数据
insert overwrite table ods.dwt_user_tags_map_all
select concat('000',ceil(rand()*10)%5,substr(md5(user_id),0,12)),str_to_map(concat_ws(',',collect_set(concat_ws(':',tag_id,tag_value)))) from ods.dws_user_action_tags_map_all group by user_id;
十、springboot创建
https://start.aliyun.com
十一、springboot逆向工程
mybatis-generator.xml
mybatis-generator:generate
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://ip:3306/ccm_ods?
useUnicode=true&
characterEncoding=utf-8&
useSSL=true&
useJDBCCompliantTimezoneShift=true&
useLegacyDatetimeCode=false&
serverTimezone=Hongkong&nullCatalogMeansCurrent=true"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="com.xf.dmp.entity" targetProject="C:\\project\\dmp\\dmp\\src\\main\\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="resources.mapper" targetProject="C:\\project\\dmp\\dmp\\src\\main">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<javaClientGenerator targetPackage="com.xf.dmp.mapper" type="XMLMAPPER" targetProject="C:\\project\\dmp\\dmp\\src\\main\\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table domainObjectName="test1" tableName="test1" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<!-- <generatedKey column="id" sqlStatement="MySql" identity="true" />-->
</table>
</context>
</generatorConfiguration>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
</parent>
<groupId>com.example</groupId>
<artifactId>dmp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dmp</name>
<description>dmp</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
<!-- 连接数据库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>$spring-boot.version</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>mybatis generator</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件-->
<verbose>true</verbose>
<!--允许自动覆盖文件-->
<overwrite>true</overwrite>
<configurationFile>
src/main/resources/mybatis-generator.xml
</configurationFile>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
十二、springboot整合hive
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
以上是关于Spark+ES+ClickHouse 构建DMP用户画像的主要内容,如果未能解决你的问题,请参考以下文章
《ClickHouse企业级应用:入门进阶与实战》8 基于ClickHouse Bitmap实现DMP用户画像标签圈人