报表统计_执行框架_框架编写 | 学习笔记

简介: 快速学习报表统计_执行框架_框架编写

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

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


报表统计_执行框架_框架编写

 

内容介绍:

一、框架设计

二、编写 ReportProcessor

三、编写 DailyReportRunner

 

一、框架设计

框架设计分为两个部分,第一个是表示可变点的 processor,就是个性点的 processor,还有一个表示公共流程的 DailReportRunner,也就是这个报表每天执行一次。两个类是需要进行编写的,下面就编写一下这两个类。

 

二、编写 ReportProcessor

1、进入 IDEA 中,在 report 下写第一个东西,叫做 DailyReportRunner,这个时候就创建了一个新的类,这个类改变为 object

在其中写一个 main 方法,关闭其他的类,这个时候 DailyReportRunner 就是公共流程所在的类。然后要为每一个个性化的点再创建一个类,这个类叫做 ReportProcessor。Runner 一般提供给要执行的代码去命名,Possessor 一般情况下提供给数据处理的类命名,ReportProcessor 是公共的一个基类。所有的 Report 生成,都继承自这个类,这是一个公共的父类,是一个基类,基类一般情况下可以是 class,但是对于这个 Processor,没有必要提供出任何公共的代码,所以可以把它改为 trait。

2、这个时候要为它提供几个方法,首先,第一个方法,要提供源表的表名,叫做 sourceTableName,它什么都不用接收,但需要返回东西出去,返回一个 string, sourceTableName 的作用就是对外提供源表的表名。第二部分是数据处理,数据处理命名为 process,process 当中一般情况下,让它接收 DataFrame,然后针对 DataFrame进行操作,操作完以后再返回一个 DataFrame。为了表示这是一个处理过程,所以接收一个 DataFrame。再写一个注释,这个方法对外提供数据处理的过程,拿到一个 DataFrame,经过处理以后,返回一个新的 DataFrame。

3、第三个方法和目标表有关,提供一个 targetTableName,targetTableName 提供的是目标表的表名,所以只需要返回一个 string 出去,不需要接收任何参数。提供一个目标表名出去,还要提供目标表的 schema 信息,接下来还需要有一个方法提供目标表的分区键。提供目标表的 scheme 信息要写一个方法,叫做 targetTableSchema,targetTableSchema 当中返回一个数据,返回 Kudo 的 schema,然后提供目标表的分区键,def targetTableKeys,返回一个 List,List 当中是 string 类型,这样的话 trait 就做好了。

package cn. itcast. Report

import org. apache. spark. sql.DataFrame

/**

*所有的 Report 生成,都继承自这个类

*这是一个公共的父类,是一个基类

*/

trait ReportProcessor {

/**

*对外提供源表的表名

/*

def sourceTableName(): String

/**

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

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

*/

def process(dataFrame: DataFrame): DataFrame

/**

*提供一个目标表名出去

*/

def targetTableName(): String

/**

*提供目标表的 Schema 信息

*/

def targetTableSchema(): Schema

/**

*提供标表的分区键

*/

def targetTableKeys(): List[String]

}

 

三、编写 DailyReportRunner

1、对于不同的报表处理过程来说,他们只需要继承 report possessor,接下来去编写 DailyReportRunner。第一步,创建 SparkSession;第二步,创建一个容器,放置所有的 processor;第三步,循环容器,拿到每一个 processor,每一个processor 都代表一个报表的统计过程;第四步应该写在循环里,读取源表;第五步,进行数据处理;第六步进行数据落地。

2、第一步创建一个 sparksession ,new sparksession.builder,master (master = “local【6】”),接下来再给一个 appName,叫做 daily report runner,接下来进行 load config,但是在 load config 之前,应该先导入编写的工具类的隐式转换。

import cn. itcast. utils.SparkConfigHelper._

import cn. itcast. utils.KuduHelper._

再接下来 getOrCreate,创建 sparksession,创建 sparksession 以后,创建一个容器,放置所有的 processor。直接 processors,new List,这个 List 当中放所有的 processor,但是现在还没有这个东西。所以给个 List ,里面给 ReportProcessor,这个时候这份代码就搞定了,processes 类型也确定了。

3、确定了以后要循环 processors,因为现在还没有编写任何的 processe,所以直接进行循环。for processor,从 processors 里面取出,这个时候 for 循环就并写好了,4、5、6三个步骤应该放在循环里面做。接下来应该读取源表,spark.readKudoTable,从 processor 当中拿到表名 sourceTableName,读取出来源表以后,给它命名,叫做 source。下面进行数据处理,数据处理的结果叫做 result,拿到 processor,processor 当中有一个方法叫做 process,这个 process 方法当中要接受一个 source data frame,直接把 source 传入,传入以后就拿到了 result。第四步的 source 是一个 option,option 是不能进行这种处理的,所以option 要先进行一个非空性的判断。

4、接下来 if (source.isDefined),如果它里面是有内容的,才继续往下走,如果没有内容就结束了。代码要写好看,否则在后期维护的时候会带来很大的麻烦。接下来拿到一个新的 source,叫做 sourceDF,从 source 当中获取 get。因为前面判断过已经 defined 过,已经有了 data frame,所以可以直接 get。继续往下走,这个 process 当中传入的就是 processDF,这个时候已经对数据处理过了,处理过以后可以进行数据的落地。spark.createKudoTable,KudoTable 应该是 processor 当中获取 targetTableName,这是第一个参数。第二个参数在 processor 中获取到 targetTableSchema,第三个参数 processor.targetTableKeys,这样数据落地的这张表就完成了。接下来,通过已经处理过的数据 saveToKudo,把它保存到 Kudo 当中。通过processor 当中取得 targetTableName,来获取到目标表的表名,这个时候整体上的流程就处理完了。

package cn.itcast. report

import org. apache. spark. sql.SparkSession

object DailyReportRunner {

def main(args:Array[String]):Unit={

import cn. itcast. utils.SparkConfigHelper._

import cn. itcast. utils.KuduHelper._

//1、创建 SparkgessEph

val spark=SparkSession. builder()

. master(master="local[6]")

. appName(name="daily report runner")

. loadConfig()

. getOrCreate()

//2.创建一个容器,放置所有的 Processor

val processors= List[ReportProcessor](

//3.循环容器,拿到每一个 Processor,每一个 Processor 都代表了一个报表的统计过程

for(processor<-processors){

//4.(读取源表

val source= spark.readKuduTable(processor.

sourceTableName())

if (source.isDefined) {

val sourceDF=source. get

//5.数据处理

val result=processor. process(sourceDF)

// 6. 数据落地

spark. createKuduTable( -

processor.targetTableName(),

processor.targetTableSchema(),

processor.targetTableKeys()

)

result.saveToKuduo(processor.targetTableName())

5、整个代码的逻辑从上层来看,从俯视视角来看,大致分为两部分。第一部分叫做 DailyReportRunner,这是整体上的一个类,整体流程的一个类,第二部分叫做 reportpossessor,reportpossessor 是具体的每一个报表处理器要继承的公共父类。所以整体的处理器当中要写一堆流程代码,每一个流程代码会有一些个性化的东西,比如说源表表名、目标表表名等,这些东西都从 report processor 当中取得,取到以后进行相应的处理,大致的逻辑就是这样。

相关文章
|
PyTorch 测试技术 API
Pytorch模型训练与在线部署
本文以CIFAR10数据集为例,通过自定义神经元网络,完成模型的训练,并通过Flask完成模型的在线部署与调用,考略到实际生产模型高并发调用的述求,使用service_streamer提升模型在线并发能力。
865 1
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
668 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
人工智能 Docker 容器
一、轻松部署的大模型开发平台dify.ai
一、轻松部署的大模型开发平台dify.ai
842 0
详细解读CList使用方法
详细解读CList使用方法
299 3
|
XML 存储 算法
使用 OpenCV 和 Python 模糊和匿名化人脸
使用 OpenCV 和 Python 模糊和匿名化人脸
224 1
|
测试技术 计算机视觉
斯坦福新研究提升大模型长视频理解能力
【2月更文挑战第29天】斯坦福大学研究团队开发的VideoAgent系统在长视频理解上取得突破,提升了大型语言模型处理视频内容的能力。该系统通过模拟人类认知过程,以高效(平均8.4帧)实现高准确率(54.1%和71.3%的零样本准确率),在EgoSchema和NExT-QA基准测试中超越现有最佳方法。VideoAgent借鉴人类观看视频的方式,迭代选择关键帧进行信息提取和推理,为长视频理解设定新标准。论文链接:[arxiv.org/pdf/2403.10517.pdf](https://arxiv.org/pdf/2403.10517.pdf)
435 1
斯坦福新研究提升大模型长视频理解能力
|
机器学习/深度学习 算法 大数据
人机交互新进展:LFR-DFSMN语音识别声学模型介绍
语音识别技术是人机交互技术的重要组成部分,而语音识别中的声学模型是语音识别技术中的核心所在,堪称重中之重。阿里巴巴iDST智能语音交互团队最新的LFR-DFSMN模型相对于之前的LFR-LCBLSTM模型可以达到训练加速3倍、识别加速2倍、识别错误率降低20%和最终模型大小压缩50%的效果,实现了语音识别的迭代速度、识别成本、服务质量的全面提升。
9139 0
|
机器学习/深度学习 运维 算法
ICLR Spotlight! 清华提出时序异常检测算法,连刷5个SOTA
ICLR Spotlight! 清华提出时序异常检测算法,连刷5个SOTA
796 0
ICLR Spotlight! 清华提出时序异常检测算法,连刷5个SOTA
|
安全 关系型数据库 MySQL
【网络安全】护网系列-应急响应排查
【网络安全】护网系列-应急响应排查
762 0
|
缓存 数据库 对象存储
阿里云68元、36元和20.2元域名注册代金券如何领取和使用?
com域名是最早出现的域名后缀之一,极具资历,在网络上具有良好的信誉,是目前全球注册量第一的域名。而cn域名是最受中国用户喜欢的域名后缀,阿里云根据用户的注册需求,对com域名推出了68元和36元域名注册代金券,而针对cn域名则推出了20.2元域名注册代金券,本文为大家介绍这些域名注册代金券如何领取和使用。
阿里云68元、36元和20.2元域名注册代金券如何领取和使用?