知识点:
-
sparksession.createDataset 需要对元素序列化(发送到task), import sparksession.implicits_ 只支持基本数据类型和case class 序列化
-
自定义序列化 Encoders.kryo(clazz)
- 现象:使用sparkSession.createDataset()创建Dataset时,如果传入的Seq类型是Map类型,那么编译时会报错,提示没有对应的encoder
解释: reateDataset()是一个科里化方法,需要传入第二个参数Encoder,sparkSession的隐式转换类中有基本数据类型和case class 的encoder,但是没有Map的encoder,所以会报错,如果想正常运行,需要使用 Encoder.kryo(Classof[T]) 这个方法构建一个encoder 并传入
- 现象:使用sparkSession.createDataset()创建Dataset时,如果传入的Seq类型是Map类型,那么编译时会报错,提示没有对应的encoder
-
hive本地运行:set hive.exec.mode.local.auto=true 本地模式
-
with view as(select *from) 创建临时表
-
hive分区dt 字段为表默认字段
-
数据校验方法: 可以用总数对比校验
hive 高阶聚合函数
- 背景:对于有多个维度的明细表,有时业务可能需要不同维度的组合来进行多维度的分析,那么如果将数据每个维度都新建一张表会建立大量的表,不利于维护,所以需要将这些不同维度的数据都插入到同一张表中;
- 原理:建立一张最细粒度的表,然后插入数据,当遇到更粗粒度的数据时,被忽略的维度给null值,即可实现所有数据都在同一张表汇总;
- 实现:现实中,表虽然有了,但是如果每种维度都需要手动去插入数据,那么效率还是极低,所以引入了hive高阶函数,(一键)生成想要的维度的数据:
- 多维模型 数据立方体 全维度 group by fileds with cube
- 自由维度组合 grouping set((f1,f2),(f3))
- 更宽范围取维度 rollup 从右到左维度变宽 (省 市 区 街道)
下钻 | 上卷 | 切片切块 | 旋转 |
---|---|---|---|
取更细维度 | 取更宽维度 | 取部分维度 | 改变group by字段顺序 |
需求:
历史表字段
日期 | 用户id | 用户首登日期 | 最后登录日期 |
---|
- 日新日活主题分析: 对uid分组, 获取日活 通过历史中间表获取日新
- 日活: 每日从日志中获取的用户
- 日新: 当日日活左连接历史表 历史表中没有的即为日新
- 历史表设计
- 历史表由自己和当日日活求出:
- 日活中没有在历史表中的(即日新) 则添加到历史表并且首登日期和末登日期为当日, 如果存在历史表中则 将末登日期修改为当日 使用full join实现
- 认知(尽量使用if 不使用where union)
- 首登日期可求出日新 最后登录日期可求出日活(为留存和新鲜度打基础)