报表统计_数据的区域分布_环境准备 | 学习笔记

简介: 快速学习报表统计_数据的区域分布_环境准备

开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第五阶段)报表统计_数据的区域分布_环境准备】学习笔记,与课程紧密联系,让用户快速学习知识。

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


报表统计_数据的区域分布_环境准备

 

内容介绍:

一、报表生成

二、按照地域统计数据集的分布情况

 

一、报表生成

1、进行报表相关的开发,报表开发当中有很多张报表需要做。

image.png

为什么需要进行报表开发?下面进行简单的说明。做报表生成的目的是一般的系统需要使用报表来展示公司的运营情况,展示公司的数据情况,这个章节对数据进行一些常见的报表开发,通过这个章节,会了解常见的报表应该怎样处理。

2、在本章节中,有六个报表需要做,中间再加一个额外的步骤,总共是七个步骤。第一个步骤,要生成数据集的地域分布报表数据,第二个步骤,是生成广告投放的地域分布报表数据,接下来是广告投放的 APP分布、广告投放的设备分布、广告投放的网络类型分布、广告投放的网络运营商分布、广告投放的渠道分布等等。下面进行更详细的了解,中间会穿插一个小的章节,来对整个环境,整个架构进行更详细的梳理。

3、目标

一般的系统需要使用报表来展示公司的运营情况,数据情况,这个章节对数据进行一些常见报表的开发

4、步骤

生成数据集的地域分布报表数据

生成广告投放的地域分布报表数据

生成广告投放的 APP 分布报表数据

生成广告投放的设备分布报表数据

生成广告投放的网络类型分布报表数据

生成广告投放的网络运营商分布报表数据

生成广告投放的渠道分布报表数据

 

二、按照地域统计数据集的分布情况

1、目标

按照地域统计数据集的分布情况,看到不同的地区有多少数据,从而能够根据地区优化公司运营策略

按照地域统计数据集的分布情况,这句话当中有两个重点,第一个重点是地域,按照地域来进行统计,统计数据集的分布情况,这两个单词要理解,什么叫地域统计?统计什么?统计数据集的分布情况。换句说法,就是要统计数据集在地域中的分布情况。比如说北京有多少条数据,上海有多少条数据,广州有多少条数据,这就叫做数据集的地域分布情况。这一章节的目标是按照地域统计数据集的分布情况,看到不同的地区有多少数据,从而能够根据地区优化公司运营策略。比如说,按照区域统计数据以后,就能看到全国哪些区域数据很少。所以需要着重增加这些区域的相关数据,或者说,有一些区域特别好,要把区域维护好,这就是我们的目标。

2、步骤

需求分析,从结果看过程;代码编写

第一步,进行需求分析,从结果看处理的过程,第二步要进行相应的代码的编写。

3、需求分析

(1)结果表

报表生成其实就通过现有的数据,先进行统计,后生成报表,然后落地到 Kudu 中

image.png

想要理解报表怎样做,先看结果是什么,如上图结果图片。

第一列是 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,

image.png

找到 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()

相关文章
|
6月前
|
人工智能 数据可视化 数据挖掘
AI竟能独立完成顶会论文!The AI Scientist-v2:开源端到端AI自主科研系统,自动探索科学假设生成论文
The AI Scientist-v2 是由 Sakana AI 等机构开发的端到端自主科研系统,通过树搜索算法与视觉语言模型反馈实现科学假设生成、实验执行及论文撰写全流程自动化,其生成论文已通过国际顶会同行评审。
417 34
AI竟能独立完成顶会论文!The AI Scientist-v2:开源端到端AI自主科研系统,自动探索科学假设生成论文
|
边缘计算 Cloud Native 物联网
专访丨阿里云郝冲:数字孪生为边缘计算带来效率革命
近年来,随着5G、物联网的发展和普及,边缘云计算得到越来越多的关注,边缘云与中心云协同赋能成为大势所趋。阿里云边缘云团队一直以来致力于打造全球最具竞争力的边缘计算服务,取得了一系列令人瞩目的成就和突破。围绕阿里云边缘计算的应用实践、边缘节点ENS等相关话题,阿里云边缘云资深专家郝冲接受了全球分布式云联盟的采访。
2026 0
专访丨阿里云郝冲:数字孪生为边缘计算带来效率革命
|
10月前
|
数据挖掘 Python
时间序列分析中的互相关与相干性分析:前导-滞后关系的理论基础与实际应用
时间序列数据在现代数据分析中广泛应用,从金融市场到生物医学领域。本文重点介绍两种分析工具:互相关和相干性分析。互相关用于量化两个时间序列的时域关系,揭示前导-滞后关系;相干性分析则评估信号在频率域的相关性,适用于脑电图等研究。通过实际案例和Python代码示例,展示了这两种方法的应用价值。
1063 8
时间序列分析中的互相关与相干性分析:前导-滞后关系的理论基础与实际应用
|
8月前
|
JSON API Go
即时通讯开源项目OpenIM配置离线推送全攻略
即时通讯开源项目OpenIM配置离线推送全攻略
351 12
|
存储 C++ Python
[oeasy]python037_ print函数参数_sep分隔符_separator
本文介绍了Python中`print`函数的`sep`参数,即分隔符。通过回顾上文内容,解释了类型与`type`的概念,并强调了参数类型的重要性。文章详细探讨了`print`函数如何使用`sep`参数来分隔输出值,默认分隔符为空格(序号32)。还讨论了如何修改分隔符为其他字符,如冒号,并解释了为何反斜杠需要使用双反斜杠表示。最后,文章追溯了`sep`名称的由来,以及相关词汇的历史背景,如盎格鲁-萨克逊人的武器和语言。
360 0
|
11月前
|
API
使用京东API接口进行支付结算有哪些注意事项?
使用京东API接口进行支付结算时,需遵守京东开放平台规定,保护用户隐私,关注API接口变化,确保应用合法、完整、可靠,正确使用API对接信息,保持API接口调用成功率,及时整改程序缺陷,结算依据以商家后台系统为准。如需帮助,请私信或评论联系。
|
Linux 区块链 vr&ar
Linux:当极客灵魂遇上网络热梗,一场跨界“笑”果非凡的盛宴!🎉
在这个笑点遍地的网络时代,技术界的“老炮儿”Linux与时俱进,化身技术与娱乐的跨界“段子手”。从“万物皆可盘”到“万物皆可跑”,Linux让智能设备飞速运转;面对“内卷”,它倡导自由进化而非恶性竞争;教“打工人”成为自己的Boss;在“元宇宙”中,Linux打造了一个等待探索的“平行宇宙”。Linux不仅是技术基石,更是一位幽默风趣的伙伴。
215 6
|
人工智能 Kubernetes Cloud Native
阿里云易立:以增效促降本,容器服务全面进入智能化时代
11月5日,2022杭州 · 云栖大会上,阿里巴巴研究员、阿里云智能云原生应用平台容器技术负责人易立在云原生峰会上发表主题演讲,发布阿里云容器服务全面智能化升级,帮助企业精益用云,以增效促降本,实现IT架构在云上的高质量发展。
阿里云易立:以增效促降本,容器服务全面进入智能化时代
|
Windows
matlab实现信道编码(代码+报告)
matlab实现信道编码(代码+报告)
359 0
matlab实现信道编码(代码+报告)
|
人工智能 运维 Prometheus
《2023云原生实战案例集》——01 汽车/制造——小鹏汽车 基于云原生实现研发提效,加速探索未来出行
《2023云原生实战案例集》——01 汽车/制造——小鹏汽车 基于云原生实现研发提效,加速探索未来出行