1 场景前提
我们将ods(贴源层)数据保存到(dwd)明细数据层时,要经过下面的操作
- 数据清洗
- session切割
- 数据规范化处理
- 位置信息继承
- 生成一个全局唯一的guid
我们可用spark来读取表,转换成rdd来进行操作
2 编程spark
2.1 我们要先读取两张表:
- session分割后的日志表 tmp.mall_applog_session_split
- geohash地理位置参考表 dim_refgeo,作为维度表
除了两张表,还需要ip地址库,将该数据读取成字节文件,广播出去
2.2 将读取到的维度数据转换成geoBean广播出去
2.3 处理日志数据
将日志表封装进一个case class (LogBean)中,并从广播数据中取到geo地理位置维度数据
先从日志中取出lagitude、longitude,计算出geoHash,
根据这个hash值,从维度数据中取数据,如果匹配的上,就返回地址信息
如果匹配不上,和ip地址数据进行关联,返回地址信息
2.4 优化细节
算子:
我们处理日志数据时使用的算子,刚开始为map,替换成mapPartition,这样,每个分区执行一次,在迭代器外面来获取广播变量,就不需要和map方法一样,每条数据都要获取一次广播变量。