开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第五阶段):报表统计_数据的区域分布_环境准备】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/680/detail/11814
报表统计_数据的区域分布_环境准备
内容介绍:
一、报表生成
二、按照地域统计数据集的分布情况
一、报表生成
1、进行报表相关的开发,报表开发当中有很多张报表需要做。
为什么需要进行报表开发?下面进行简单的说明。做报表生成的目的是一般的系统需要使用报表来展示公司的运营情况,展示公司的数据情况,这个章节对数据进行一些常见的报表开发,通过这个章节,会了解常见的报表应该怎样处理。
2、在本章节中,有六个报表需要做,中间再加一个额外的步骤,总共是七个步骤。第一个步骤,要生成数据集的地域分布报表数据,第二个步骤,是生成广告投放的地域分布报表数据,接下来是广告投放的 APP分布、广告投放的设备分布、广告投放的网络类型分布、广告投放的网络运营商分布、广告投放的渠道分布等等。下面进行更详细的了解,中间会穿插一个小的章节,来对整个环境,整个架构进行更详细的梳理。
3、目标
一般的系统需要使用报表来展示公司的运营情况,数据情况,这个章节对数据进行一些常见报表的开发
4、步骤
生成数据集的地域分布报表数据
生成广告投放的地域分布报表数据
生成广告投放的 APP 分布报表数据
生成广告投放的设备分布报表数据
生成广告投放的网络类型分布报表数据
生成广告投放的网络运营商分布报表数据
生成广告投放的渠道分布报表数据
二、按照地域统计数据集的分布情况
1、目标
按照地域统计数据集的分布情况,看到不同的地区有多少数据,从而能够根据地区优化公司运营策略
按照地域统计数据集的分布情况,这句话当中有两个重点,第一个重点是地域,按照地域来进行统计,统计数据集的分布情况,这两个单词要理解,什么叫地域统计?统计什么?统计数据集的分布情况。换句说法,就是要统计数据集在地域中的分布情况。比如说北京有多少条数据,上海有多少条数据,广州有多少条数据,这就叫做数据集的地域分布情况。这一章节的目标是按照地域统计数据集的分布情况,看到不同的地区有多少数据,从而能够根据地区优化公司运营策略。比如说,按照区域统计数据以后,就能看到全国哪些区域数据很少。所以需要着重增加这些区域的相关数据,或者说,有一些区域特别好,要把区域维护好,这就是我们的目标。
2、步骤
需求分析,从结果看过程;代码编写
第一步,进行需求分析,从结果看处理的过程,第二步要进行相应的代码的编写。
3、需求分析
(1)结果表
报表生成其实就通过现有的数据,先进行统计,后生成报表,然后落地到 Kudu 中
想要理解报表怎样做,先看结果是什么,如上图结果图片。
第一列是 region,第二列是 city,第三列是数据的个数。第一行的含义是云南省昆明市有八条数据,第二条数据的含义是内蒙古省呼和浩特市有七条数据,第三条数据是内蒙古赤峰市有两条数据。原始的数据集都已经非常清楚明白是什么数据了,接下来,该如何按照 region 和 city 统计数据?怎样得到这样一个结果集?
在结果集当中有三个字段,省、市和数据量,含义就是想看到所有的省市分别有多少数据。
(2)处理过程
读取 ODS 数据
按照省市分组
统计数量
落地 Kudu
第一步要读取 ods 数据,第二步要按照省市进行分组,既然要统计省市对应的数据量,就应该按照省和市先分组,分完组以后直接求 count,就能得到每一组的数量。先分组,后统计,最后落地到 Kudo 中。
4、代码编写
(1)创建文件com. itheima. Dmp. report.RegionReport
Processor
(2)代码编写
object RegionReportProcessor {
def main(args:Array[String]):Unit={
import com. itheima. dmp. utils.SparkConfigHelper._
import com. itheima. dmp. utils.KuduHelper._
import org. apache. spark. sql. functions._
val spark=SparkSession. builder()
. master("local[6]")
.appName("pmt_etl")
.loadConfig()
-getOrCreate()
import spark. implicits.
val origin=spark.readKuduTable(ORIGIN_TABLE_NAME)
if(origin.isEmpty) return
val result=origin. get.groupBy($"region",$"city").
.agg(count($"*") as "count")
. select($"region",$"city",$"count")
result.createKuduTable(TARGET_TABLE_NAME, schema, keys)
result.saveToKudu(TARGET_TABLE_NAME) 5
}
private val ORIGIN_TABLE_NAME=PmtETLRunner.ODS_TABLE _NAME
private val TARGET_TABLE_NAME="ANALYSIS_REGION _"+
KuduHelper. formatted Date()
import scala. collection.JavaConverters._
private val schema=new Schema(List(
new ColumnSchemaBuilder("region",
Type.STRING). nullable(false). key(true). build,
new ColumnSchemaBuilder("city",
Type.STRING). nullable(true). key(true). build(),
new ColumnSchemaBuilder("count",
Type.STRING). nullable(true). key(false). build()
) .asJava
代码编写首先需要创建一个文件,文件建在 report 的包下,叫做 RegionReportProcesson,直接进行代码编写。先去创建一个文件,文件创建在 report 下,文件名称叫做 RegionAnalysis。RegionAnalysis 当中要把它改为 object,改为 object 以后把 main 方法写出来。步骤先简单梳理一下,第一步创建 SparkSession,第二步读取 ods 层的数据,第三步按照省市进行分组求得结果,第四步落地到 Report 表中,这就是整个的四大步骤,下面一步一步去实现它。在这之前先改一下 RegionAnalysis 的类名,修改为 RegionReportProcessor。整个的流程总结一下,就是从 ods 层取出数据进行处理,就是分组统计,接下来再落地到 report 表当中,这个时候 ods 在 Kudo 中,report 也在 Kudo 中。这样,整个过程特别明确,要先有原表的表名,不知道原表的表名叫什么该怎么办?原表的表名在 ETL 当中落地,打开 ETL,找到 ETLRunner,runner 当中有原表,看 structure,
找到 TARGET_TABLE_NAME,TARGET_TABLE_NAME 就是 ODS 层的表名,修改一下之前的命名,之前是 TARGET_TABLE_NAME,改为 ODS_TABLE_NAME,这样比较容易让外部理解。改完名以后把private 去掉,这个时候就可以访问。一般提供给外部访问的字段,可以在后面主动注明他的类型,这是为了安全起见。
//4.数据落地
Spark.createKuduTable(ODS_TABLE_NAME,schema,keys)
Result.saveTokudu(ODS_TABLE_NAME)
}
val ODS_TABLE_NAME:string =’ODS_” + KuduHelpe.formattedDate()
这个时候就可以从 ETLRunner 当中取到 ods 层的表名。回到 RegionReportProcessor 中,把其它窗口关闭。先命一个名,叫做 SOURCE_TABLE_NAME,SOURCE_TABLE_NAME 叫做 ETLRunner 当中的 ODS_TABLE_NAME,这个时候就已经把原表的表名处理好了。接下来 , TARGET_TABLE_NAME 可以命名为 report_data_region,在后面加上今天的日期,加上日期是一个比较好的习惯。Report 这张表也会按照一定的周期生成,要统计每日数据的话,就要在后面追加上日期。KudoHelper.formatted 追加日期,这个时候,原表的表名和目标的表明就完成了。然后去做刚才的四个步骤,第一步直接拿 spark,然后 SparkSession.builder,builder 以后设置 appName,appName 命名为 report ,master 给定为 local【6】,接下来 getOrCreat, getOrCreat 之前 loadConfig,但是没有这个方法,所以导入隐式转换
import cn. itcast. utils.SparkConfigHelper._
import cn. itcast. utils.KuduHelper._
就可以读取 ods 层的数据,使用 spark.readKudoTable, 要指定 tablename,指定为 SOURCE_TABLE_NAME。指定完以后就获取到了 source data frame,获取到 source data frame 以后,看一下 source 是什么类型?他是一个 option 类型,因为 readkudotable 当中有可能没有这张表,没有这张表,自然不能访问数据。所以就应该给一个 option 让外部知道这个地方可能没有数据,然后在外部进行一些相应的判断。做一个简单的判断,这个判断就是当 source 里面没有数据的话 isEmpty,如果 isEmpty 的话,return 就是后面的代码就不执行。因为没有 ods 层的表,没有办法进行报表统计。把表名和环境准备好,下面再进行具体的数据统计。
object RegionReportProcessor {
/**
*Kudu.ODS->分组统计->Kudu. Report
*/
def main(args:Array[String]):Unit={
import cn. itcast. utils.SparkConfigHelper.
import cn. itcast. utils.KuduHelper.
//1.创建 SparkSession
val spark=SparkSession. builder()
.appName(name="report data region")
. master(master="local[6]")
.loadConfig()
·getOrCreate()
//2.读取 ODS 层数据
val source:Option[Data Frame]=spark.readKuduTable(SOURCE_
TABLE_NAME)
if (source.isEmpty) return
//3.按照省市进行分组求得结果
//4.落地到 Report 表中
}
private val SOURCE_TABLE_NAME=ETLRunner.ODS_TABLE_
NAME
private val TARGET_TABLE_NAWE="report_data_region _"+
KuduHelper. formatted Date()