分层优点:复杂的东西可以简单化、解耦(屏蔽层作用)、提高复用、方便管理
SA 贴源 数据组织结构与源系统保持一致
shm 历史层 针对不同特征的数据做不同算法,目的都是为了得到一份完整的数据
PDM 明细层 做最细粒度的数据明细,最高扩展性和灵活性,企业级的数据标准,源系统之间的打通
BDM 业务层 针对集市经常放在一起用到的数据做提前预处理,做维度的横向拆合,来源的纵向拆合,形成业务大宽表
基础层 针对集市主题做定制化整合,部门级的数据标准
集市层 基础层和关系层基础上加工出基础原子指标
汇总层 集市层的原子指标基础上增加业务限定、统计周期、统计粒度计算出来的派生指标
报表、指标层 基础指标或派生指标的逻辑计算加工而成
埋点行为数据组成
公共字段
业务字段:埋点上报的字段
事件
"et": [ //事件 { "ett": "1506047605364", //客户端事件产生时间 "en": "display", //事件名称 启动和事件日志是根据事件名称的不同 "kv": { //事件结果,以 key-value 形式自行定义 "goodsid": "236", "action": "1", "extend1": "1", "place": "2", "category": "75" } } ]
项目经验总结
1.shell 中单引号和双引号的区别? ''不转义变量 “”转义变量
反引号 `执行引号中命令
2.tez优点:
可以将多个有依赖的作业(任务)组合成一个完整的DAG作业,只需一次读写HDFS,效率更高。
3.ods层:
启动日志表:只有一个字段line保存json
事件日志表:只有一个字段,按dt分区
4.自定义UDF,可以自己埋点打印日志,方便调试。
函数定义
public Text evaluate(Text input, int startIndex, int length) {
// 在函数开始处打印日志
System.out.println("Executing SubstringUDF...");
// 打印输入参数
System.out.println("Input: " + input.toString());
System.out.println("Start index: " + startIndex);
System.out.println("Length: " + length);
// 执行子字符串操作
String result = input.toString().substring(startIndex, startIndex + length);
// 在函数结束处打印日志
System.out.println("Substring: " + result);
System.out.println("SubstringUDF execution completed.");
// 返回结果
return new Text(result);
}
打成jar包并注册
$ javac -cp /path/to/hive/lib/hive-exec-x.x.x.jar SubstringUDF.java
$ jar -cvf substringudf.jar SubstringUDF.class
$ hive
hive> ADD JAR /path/to/substringudf.jar;
使用
-- 创建测试表
CREATE TABLE employees (
name STRING,
salary INT
);
-- 插入测试数据
INSERT INTO employees VALUES
('John Doe', 5000),
('Jane Smith', 6000),
('Michael Johnson', 7000);
-- 使用自定义 UDF 函数获取员工姓名的子字符串
SELECT name, substring_udf(name, 1, 4) AS substring_name FROM employees;
输出结果
Executing SubstringUDF...
Input: John Doe
Start index: 1
Length: 4
Substring: John
SubstringUDF execution completed.