1. 入门
安装Groovy,新建Groovy项目
- Groovy基本语法:https://blog.csdn.net/weixin_52851967/article/details/125390597
- 基础语法如下
package com.llh.test
class GroovyTest {
static void main(String[] args) {
println "hello world"
println(geBigDecimal())
System.out.println("这种方式也支持")
def def001 = getDef()
println(def001.isBigDecimal())
//GString类型
def testName = "call me"
//GString类型,Groovy特有
def text = "Hello : ${testName}"
println testName.toString()
println text.toString()
//多行字符串保留格式
def mail = '''\
abc
efg
'''
println(mail)
//填充
def str = "groovy hello"
println str.center(14, "R")
println str.padLeft(14, "L")
println str.padRight(14, "0")
def str2 = "G"
def str3 = "g"
//比较unicode码
println str3 > str2
//比较字符串
println str3 <=> str2
//字符串相减
println str - str3
// switch...case支持各种类型
switch ("abc") {
case "ll":
println "ll"
break
case "ABC":
println "123"
break
default: println("456")
}
//范围循环
def sum = 0
for (i in 0..9) {
sum += i
println(sum)
}
for (i in ["张三": 23, "lucy": 19, "Bob": 30]) {
print(i.key)
sum += i.value
}
}
static def getDef() {
return "中文"
}
/**
* 获取字符串
* @return
*/
static String getString() {
return "1231231"
}
static Integer getInteger() {
return 123123
}
static Long getLong() {
//注释
/*
注释
*/
return 123123123123L
}
static Double getDouble() {
return 0.123123123123
}
static Float getFloat() {
return 0.123123123123
}
static BigDecimal geBigDecimal() {
return 123
}
}
1.1. Hive/Doris
1.1.1. hive是什么
hive基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,提供类sql查询功能
基本语法
show
create table vts_llh_dwd.first_test;
show
create table vts_llh_dwd.first_test;
use
vts_llh_dwd;
create
database if not exists vts_llh_dwd;
use
vts_llh_dwd;
drop table if exists first_test;
create table if not exists first_test
(
id
int
comment
'编号',
name
string
comment
'姓名'
) comment '第一张测试表'
TBLPROPERTIES
(
'author' =
'llh',
'desc' =
'第一个测试表',
'remark' =
'备注信息'
);
alter table vts_llh_dwd.first_test
add columns (etl_update_time string comment '更新时间');
show
tables;
select *
from vts_llh_dwd.first_test limit 10;
直接使用hadoop所面临的问题
- 人员学习成本太高
- 项目周期要求太短
- MapReduce实现复杂查询逻辑开发难度太大
1.2. 数据仓库分层
数仓的分层的每一层都有自己的职责,同时都是基于下一层或者下面多层做数据处理之后的结果
1.2.1. ODS
- 贴源层,接近数据源的一层,数据最原始,最真实未经太多处理
- 还起到一个数据备份作用,特殊行业,ODS层数据甚至会保留一年甚至多年
- 日志数据估算,也尤为重要,磁盘一般需要保留30%缓冲空间,数据本身可以做压缩,数仓还要做分层,数据本身存储还会有备份机制(HDFS/Kafka等框架)
- ODS层也并不意味着一定就是未经任何处理的数据,企业级项目,因为真实环境可能存在采集错误,bug,网络等问题,会造成原始数据存在问题
- 字段缺失
- 数据字段不统一
- 格式错误
- 数据来源混乱
- 数据类型不易,如json,xml,text等
- 一般企业级ODS会对原始数据,做一些基本处理
- 数据来源区分
- 按时间分区存储,按天,年,月,日
- 基本数据处理,格式错误丢弃,关键信息丢失的过滤
- 当然,DWD层也是可以做这一层处理优化,关键看公司技术规范
- ODS层建表时,如果时hive进行处理,一般建外部表
- hive的外部表,相对的是业务表
- 外部表存放数据文件可以不是在hive的hdfs默认位置,hive对应表删除时,对应数据文件并不会被删除,这样可以防止误操作
- 业务表则相反,数据文件存放在hive对应的默认位置,表删除对应文件也会被删除
- 大数据开发,使用hive时,一般都是用外部表
1.2.2. DWD
- DWD又叫数据明细表,很多时候存储的是事实表为主
- 在DWD层,会有ETL(extract transform load) 提取转换加载处理,逻辑较复杂,用hive一般无法满足要求,这些逻辑一般是编写代码实现,使用脚本进行周期性调用
- 筛选字段,去除废弃,格式错误,丢失关键字段的信息
- 数据规范化,可能不同业务不同来源的数据类型空值不同,这时候会在DWD层做抹平。如:boolean类型有true/fals,1/0的;字符串代表空的有""/null的;日期格式差异更大的
- DWD存储数据,一般就是维度表,事实表,实体表等数据
- 维度表,一些维度信息,一般直接存储维度信息,表一般不会很大
- 事实表,就是表述一些事实信息,如订单,收藏,购物车这些,数据量大,一般存储维度主键,具体维度值在后续处理分析时再临时关联
- 实体表,类似javabean,用来描述信息,如优惠券表,促销表,内部就是描述信息,大部分时全量导入
- 事实表中数据,一般不是所有维度都按照维度主键做信息存储
- 数仓理论中,去除数据冗余的思想,一般会将维度信息单独存放,其他表要用时,记录对应维度的id。
- 即使维度数据变化,也不会影响到多个表,降低了数据冗余
- 做数据映射
- 如将GPS经纬度转换为省市区详细地址
- ip地址也转换位省市区详细地址
- 将时间转换为年,月,日甚至周,季度维度信息
1.2.3. DWS
- 数据服务层,数据聚合层,为更上层的ADS层或者直接面向需求方服务
- DWS建模,一般用主题建模,维度建模等方式
- 主题建模,围绕某一个业务主体进行数据建模,将相关数据抽离提取
- 流量绘画按照天,月聚合
- 每日新用户进行聚合
- 每日活跃用户聚合 2.维度建模,根据业务需要,提前将后续数据查询处理需要的维度数据抽离出来,方便后续查询用
- 运营位维度数据聚合
- 渠道拉新维度数据聚合
- 主题建模,围绕某一个业务主体进行数据建模,将相关数据抽离提取
1.2.4. ADS
- 应用服务层,直接对接OLAP分析,或者业务层数据调用接口
- 最顶层,一般是结果类型数据,可以直接展示的数据,数据抽离分析成都最高的一层数据
- 需求最明确的一层,接口相对最固化