开发者学堂课程【2020版大数据实战项目之DMP广告系统(第六阶段):商圈库_功能_思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/681/detail/11831
商圈库_功能_思路
内容介绍:
一. 数据计算平台:批量计算,流计算
二. 生成功能表的目的和原因
三. 功能的含义
四. 数据的处理方式
五. 高德api的查询
一.数据计算平台:批量计算,流计算
1.数据处理的思路呢?
首先整个的数据计算平台大概有两种,第一种是批量计算,第二种是流计算。批量计算是一批一批的计算,而流计算是一个一个的计算。现在这个场景是批量计算。商圈库是要保留所有的这个经纬度对应的商圈信息,也就是最终的商圈库所生成的这个表,应该是这种形式的。
首先有一个 Key,这个 Key,可以对应的是一个 location 信息,或者就定义为 geo。这个geo对应第一个列,第二个列应该对应一个商圈信息,那就是area信息,最终的这个表当中可以只有两个内容,一个是 geo 也就是地理位置,还有一个 area 是商圈的名字。
二.生成功能表的目的和原因
接下来要思考的一件事情就是,如果要生成 geo.area 这样的一张表,那为什么要生成这张表?生成这张表的意义何在?
先复制 private val AREA_TABLE_NAME=BUSINESS_AREA’’这个注释,写到类上。
做这个功能最终的结果为:geo,area ,这样的一张表有两列,那要做这个功能的目的是什么?为什么要做这个功能?
如果不做这个表,在生成标签时,因为这个商圈库是为标签服务提供的,既然它是为标签提供服务的,那么在生成标签的时候要为某一条数据生成一个叫做商圈的标签,所以就要在每一条数据生成标签的时候都要去访问一下高德。
三.功能的含义
这个高德的api不是一直能用的,每天是有使用次数的。所以就可能会出现失败的情况。接下来就可以再针对数据来进行一次处理,获取其商圈信息,缓存下来,这个缓存就是商圈表。其实要做这个商圈库,只是把这个商圈的信息挪到本地而已,如果不做这个功能也可以从高德里面拿到,在生成标签时拿到就行。
但是每一次生成标签的时候都去拿,高德会限制不会让一直查,它是有次数限制的,查多了就不让再查了。
这个功能最核心的一点就是按照经纬度的范围,作为 key,商圈信息作为 value,生成一张表。
也就是在这个范围内的所有的经纬度,对应的都是这个商圈。这样就可以提高命中率。从而就不需要每一次都去查高德,查的多了基本上就有整个高德的数据库。所以就可以节省网络资源,速度相对来说也会更快一些,这是这个功能的含义。
四.数据的处理方式
这个功能简单介绍一下,有两种数据的处理方式,对于商圈标签生成时数据可能是流式的,也可能是批样的处理。
如果是流式,那么就是来一条数据就去查询一下商圈信息,那如果是批式,就是来一批就去查询商圈信息,并统一进行计算。
最终目的不能每一次都去读取全量的数据生成标签,应该尽量的减少查询高德api的次数。那怎么去做到减少查询高德的 api 的次数呢?这个办法也是比较简单的。先读取 O D S 层的数据,生成每条数据所在的地理位置的范围。其实也就是表中的 key。
读取完 O D S 层的数据以后再和商圈库做一次相应的剪辑。假如说这个 key 已经存在了,那么就没有必要再去查询高德的 api 了。就和商圈库做一次差集,如果数据key存在则去掉这条数据,再进行高德 api 的查询。虽然说起来容易,但是其实并没有那么好做。
五.高德api的查询
接下来就可以再去读取一张表,这张表就读取已经生成的area,这是已经生成的商圈库,还要再读取出来,那么整条代码就是:
val areaOption=spark. read kuduTable (AREA_TABLE_NAME), (AREA_TABLE_NAME
。
将If(sourceceOption.isEmpty)return这一行代码删除,就有以下两个代码:
val areaOption=spark. read kuduTable (AREA_TABLE_NAME)
Val soureOption=spark. read kuduTable(ODS_TABLE_NAME)
这两个代码都是Option,那这个area有可能是不存在的,所以就可以去判断,因为这个代码不分source,所以当这个代码出现
if odsOption.isDefined, 说明ods表已经存在了,并且整个代码:if odsOption.isDefined && areaoption isEmpty,也就是说明不存在area商圈库的这张表,那么这就是一种处理逻辑。
走到这里说明这个ods表是存在的,但是商圈表不存在,就意味着在这个分支中,不需要进行差集。
那么代码 else if(odsoption.isDefined&& areaOption). isDefined 肯定也是存在的,并且这个 option 也是存在的,那么两个东西都存在。其实不要 else 也是一样,都做一个全量的判断,假如说这个 odsoption 是存在的,但是这个 area option 不存在,商圈和ods 两张表都存在。
这里说明 ods 表是存在的,商圈表也存在,这时就说明要先进行差集,去掉已有的数据,再查询高德Api。这就是一个大致的逻辑。这个逻辑还是稍微有一点绕,虽然绕但还是有必要这样去做。这就是最终的结果。
接下来就可以在外部去给定一个结果,这个结果就是一个 result,这个 result 暂且可能为空。它是一个 data frame 的类型,到最后判断 data frame 是否存在,将它Import 一下。到最后数据落地时,判断一下 result,如果它不等于空,就进行相应的落地。走到这里,说明数据至少处理过了,所以可以进行落地。
这就是大致的逻辑,再梳理一遍,梳理一遍以后,给一个 nul l,就可以进行后续的编写了。如下图所示:
当然这个逻辑是比较复杂的,虽然没有标签生成逻辑那么绕,但是稍微有一点复杂,那么这个章节就先暂时告一段落。