报表统计_执行框架_旧模块改造 | 学习笔记

简介: 快速学习报表统计_执行框架_旧模块改造

开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第五阶段)报表统计_执行框架_旧模块改造】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/680/detail/11818


报表统计_执行框架_旧模块改造

 

内容介绍:

一、创建 processor 的类

二、到 DailyReport 中注册

三、总结经验

 

一、创建 processor 的类

1、在前面已经写了一个 RegionReportProcessor,也就是已经有一个报表的处理类了。这个报表的处理类明显不是遵循 report possessor 的写法。

image.png

可以把这个类改成 report possessor 的写法。大致分为两步,第一步,创建一个 processor 的类;第二步,到 DailyReport 当中注册。

2、先去创建,编写一个 scala class,名称叫做 NewRegionReportProcessor。这个 processor 第一件事是让他继承 ReportProcessor,把 class 改为 object,重写其中的方法,实现其中的方法,把把每一个方法都实现。第一个方法 sourceTableName,应该找 ETLRunner,从其中取出 ODS_TABLE_NAME。targetTableName 可以直接到 RegionReportProcessor 中拷贝,也可以手写。在这里我们手写,这个可以叫做 report_data_region_"+KudoHelper.formattedDate,formattedDate 就是格式化过的日期字符串。

3、下面要提供目标表的 schema 信息,拷贝目标表的 schema 信息.

import scala. collection.JavaConverters._

private val schema=new Schema(

List(

new ColumnSchemaBuilder(name="region",Type.STRING). nullable(false). key(true). build,

new ColumnSchemaBuilder(name=“city”, Type.STRING). nullable(true). key(true). build(),

new ColumnSchemaBuilder(name="count",Type.STRING). nullable(true). key(false). build()

) .asJava

放到 NewRegionReportProcessor 当中。可以直接不 new 出 schema,直接把 schema 返回,这个方法对外提供了一个 schema 信息。

4、倒数第二步提供目标表的分区键,一个是 region,还有一个是 city,这个时候就把 List 提供出去了,提供出去以后,整体上该提供的信息都提供了,就差数据处理的过程了。直接拿到 dataFrame 然后 groupBy,groupBy 之前要用到“.”或者“$”,import dataFrame.sparkSession.implicits._,导入 implicits 后点一下可以找到 region,再点一下可以找到 city 。通过这两个列进行相应的分组,分组完了以后使用 agg,在使用 agg 的时候还要再导入一个 import_org.apache.spark.sql.functions._,这个时候 app 里就可以进行 count,这个 count 里面可以写“*”,对整个 count 进行一个统计,对所有的行进行一个统计,统计完以后,每个分组的行数就有了,可以 as count。

5、最后一步,select(cols = 'region,'city,'count),整体的处理流程就结束了。经过这样一步处理,生成了一个新的 DataFrame,顺着返回值返回到外面去,所以整个功能已经全部实现。

import org. apache. spark. sql.DataFrame

object NewRegionReportProcessor extends ReportProcessor {

/**

* 对外提供源表的表名

*/

override def sourceTableName(): String={

ETLRunner.ODS TABLE NAME

}

/**

*对外提供数据处理的过程

*拿到一个DataFrame,经过处理以后,返回一个新的DataFrame

*/

override def process(dataFrame:Dataframe):DataFrame={

import_org.apache.spark.sql.functions._

import dataFrame.sparkSession.implicits._

dataFrame.groupBy(cols = 'region,'city,)

agg(count(columnName=”*”)as “count”)

select(cols = 'region,'city,'count)

/**

*提供一个目标表名出去

*/

override def targetTableName(): String={

"report_data_region_ "+KuduHelper.formattedDate()

}

/**

*提供目标表的Schema信息

*/

override def targetTableSchema():Schema= {

import scala. collection.JavaConverters.

new Schema(

List(

new ColumnSchemaBuilder(name="region",Type.STRING). nullable(false). key(true). build,

new ColumnSchemaBuilder(name=“city”, Type.STRING). nullable(true). key(true). build(),

new ColumnSchemaBuilder(name="count",Type.STRING). nullable(true). key(false). build()

). as]ava

)

}

/**

*提供目标表的分区键

*/

override def targetTableKeys(): List[String] = {

List (“region”,”city”)

}

 

二、到DailyReport 中注册

1、总共两大步,第一步写这个类,第二步注册这个类,在下图地方写上 NewRegionReportProcessor。因为这是 object,所以不需要把它创建出来,直接放到 processor 里就可以了,写完以后直接运行 main 方法。

2、运行结果是没有任何问题的,整个程序是可以运行的,没有报错。

image.png

 

三、总结经验

1、下面总结一下整个的经验,DailyReportRunner 是整个的入口,

image.png

其次,会有多个 processor,比如说刚才写了 NewRegionProcessor, NewRegionProcessor 是某一个具体报表的处理类。在写一个新的报表,还是两个步骤,第一步,继承 report processor 写一个新的 processor object;第二步把新的 processor,比如说 NewRegionReportProcessor 注册到 DailyReportRunner 当中,经过这两步就可以完成一个新的功能。

2.NewRegionReportProcessor 代码更干净,并且所实现的功能是一样的,但是这个代码会把不同的功能放在不同的代码当中,每个代码各司其职,这样的代码会相对干净一些。这符合软件开发原则当中的单一职责原则,这种代码会多一层体系,就是他每一个东西都要放在一个函数当中,但是整体的流程是干净的。整体流程是干净的,以后要改的时候就方便知道去哪个地方改,并且在这个方法里面改源表名能确定改了这个地方不影响其他地方,因为这是模块化的,这是第一个好处。

3、第二个好处,查看代码,总共12行有效代码,再来查一查 RegionReportPossess,共27行代码,算的都是有效代码。一个只有12行的核心代码,一个有27行代码的核心代码,大家觉得哪一个类会更好些?现在说的这些都是开放性的,如果不喜欢现在这种写法,可以采用原来的写法。我有一个同事,他有一个想法是为什么要搞一个流程出来?不搞这个流程,写一个方法,这个方法接收十来个参数。从业界主流的声音来看,这样不是好做法,其实通过这样的做法能实现功能也是好的,所以大家可以采用自己喜欢的方式。这就是整个的内容,流程希望大家都搞清楚,总共两大块。

image.png

看代码框时要着重考虑这个代码的结构是怎样的,而不是流程。看到 dailyreport runner 的时候,才应该关注流程。

相关文章
|
7月前
|
缓存 前端开发 数据格式
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
|
7月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
78 0
|
10月前
|
C++ Python
量化交易系统开发详细步骤/需求功能/策略逻辑/源码指南
Developing a quantitative trading system involves multiple steps, and the following is a possible development process
游戏对接广告看视频系统开发详细规则/方案逻辑/步骤逻辑/规则玩法/源码程序
Advertising location and display method: According to the characteristics of the game interface and scene, choose the appropriate advertising location and display method to ensure that the advertisement naturally integrates into the game and does not affect the player's game experience.
|
10月前
|
自然语言处理 搜索推荐 算法
Metaforce佛萨奇2.0丨3.0系统开发稳定版/需求设计/功能说明/案例项目/逻辑方案/源码程序
Metaforce佛萨奇系统是一个基于人工智能技术的虚拟助手系统,
|
vr&ar 安全 AndFix
Metaforce佛萨奇系统开发案例详细丨方案逻辑丨项目程序丨规则玩法丨源码功能
Requirement analysis: Communicate fully with customers to understand their specific needs and expectations for the Metaforce Sasage system, including game types, features, art styles, etc
|
Cloud Native 前端开发
【性能优化上】第三方组织结构同步优化一,分状态,分步骤的设计,你 get 到了吗?
【性能优化上】第三方组织结构同步优化一,分状态,分步骤的设计,你 get 到了吗?
|
敏捷开发 测试技术
推三返一开发稳定版丨推三返一项目系统开发详细指南/方案需求/步骤逻辑/流程功能/案例设计/技术架构/源码程序
推三返一系统开发是一种软件开发模式,也被称为迭代增量开发模式。它是一种敏捷开发方法的一种,通过将整个开发过程分为多个迭代周期,每个周期都会增加新的功能和特性,并在每个迭代周期结束后进行测试、反馈和修改。推三返一系统开发的核心思想是“推进三步,反馈一步”。
|
存储 SQL 关系型数据库
|
设计模式 分布式计算 搜索推荐
报表统计_执行框架_设计 | 学习笔记
快速学习报表统计_执行框架_设计
137 0
报表统计_执行框架_设计 | 学习笔记