数据预处理-航线类型操作类型-读取规则到程序|学习笔记

简介: 快速学习数据预处理-航线类型操作类型-读取规则到程序

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段数据预处理-航线类型操作类型-读取规则到程序】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/671/detail/11654


数据预处理-航线类型操作类型-读取规则到程序


内容介绍:

一、航线类型操作类型目标

二、航线类型操作类型实现思路


一、航线类型操作类型目标

1. 概述

前面的课程中已经将数据分类中飞行类型和操作类型的详细思路进行了学习,接下来按照思路顺序进行每一步的实现。第一步是读取数据库的分类规则到预处理程序,对四种场景分别读取,这一步之前需要读取原始数据。目前所显示的界面表示原始数据已经读取过来了,下面进行代码的写入。代码写入的第一步是读取数据库的分类规则到预处理程序,分为四种情况如然后添加到预处理程序当中,该流程也属于读取数据库的规则。前一次读取规则是在setupSSC 目录里面的初始化阶段读取,读取数据库中的过滤规则。因为读出来的数据是在 foreachRDD 里面的,每间隔两秒钟就需要执行一次代码,数据库的读取操作在 MySQL 里意味着每隔两秒钟就需要读取一次MySQL,而MySQL 加载过程比较复杂,所以要先在程序初始化的时候把规则读取过来,然后在每一次迭代的时候把它再redis里进行标记,对应流程中的是否需要更新一个标记。


二、具体流程

在程序初始化阶段,可以看到读取到的过滤规则,再把读取数据的分类规则写入,写入方法如讲义中所示:AnalyzeRuleDel. queryRuleMap(),其中 queryRuleMap()会报红,而 AnalyzeRuleDel.不会,这是因为AnalyzeRuleDel.在前面读取过滤规则时已经写入了,而queryRuleMap()还未被写入。

下面创建 queryRuleMap()的方法,右键选择 create 进行编辑,数据分类规则的读取分为四种情况。现在需要读取的最关键数据只有一个字段及附加条件,具体的四种情况如下:

分别是国内查询(00)、国际查询(01)、国内预定(10)、国际预定(11),针对这四种情况可以借用 queryData(sql,field)方法,分别写一个sql及字段进行接收即可。借用该字段需要注明前面的参数 sql,并且要有一个 field 字段进行接收。

1.sql 语句的写入

国内查询:

val nqsQL="select expression from itcast_classify_rule

where flight_type=0 and operation_type=0"

国内为 national,查询为 query,因此国内查询的简写为 nq。select 的表来自 itcast_classify_rule,国内查询的SQL,把数据读取过来,先写 SQL,再把字段读取过来,这就是调用方法。国内查询中的 flight type 代表的航班类型=0,operation type 代表的操作类型=0,即 flight_type=0 表示国内,operation_type=0表示查询。

image.png

国际查询、国内预定、国际预定只需要将上述语句进行稍微改动即可,代码分别为:

国际查询:

val niqsQL="select expression from itcast_classify_rule

where flight_type=1 and operation_type=0"

国际为 international,查询 query,缩写为 iq,flight_type=1表示国际,operation_type=0表示查询。

国内预定:

val nbsQL="select expression from itcast_classify_rule

where flight_type=0 and operation_type=1"

国内为 national,预定为 book,缩写为 nb,flight_type=0 表示国内,operation_type=1表示预定。

国际预定:

val nbsQL="select expression from itcast_classify_rule

where flight_type=1 and operation_type=1"

国际为 international,预定为 book,缩写为 ib,flight_type=1表示国际,operation_type=1表示预定。

至此查询语句已经写好,但是具有一定缺陷,语句均被写死,材料中提供了几个枚举,behaviour type 表示的是操作类型,query 和 book 分别表示的是查询和预订,flight type 表示航线类型,0代表着国内,1代表着国际。利用枚举可以进行完善,首先是 behaviour 的枚举,其中 query 表示查询,即0表示查询,刚才所写的代码中 operation type表示查询,将0删除后并添加上枚举 BehaviorTypeEnum.Query,但是所调用的并非 query 的字段,而是它所代表的0,因此还需要在 BehaviorTypeEnum.Query 后加上.id,即可拿到查询所代表的0字段。

操作类型修改完毕后是飞行类型,其枚举为:FlightTypeEnum。需要引入的 national(0)表示国内,删除源代码中的0后加入枚举 FlightTypeEnum.National.id

修改后的国内查询代码为:

val nQSQL = "select expression from itcast_classify_rule

where flight_type="FlightTypeEnum.National.id" and

operation_type= " Behavior TypeEnur ,Query.id

表示飞行类型为 national.id=0,即 flight_type=0国内,Query.id=0,即查询

其它修改方式类似,分别加上枚举和.id,修改后的代码分别是:

国际查询:

val iqSQL = "select expression from itcast_classify_rule

where flight_type="FlightTypeEnum.International.id" and

operation_type= " Behavior TypeEnur ,Query.id

国内预定:

val nbSQL = "select expression from itcast_classify_rule

where flight_type="FlightTypeEnum.National.id" and

operation_type= " Behavior TypeEnur ,Book.id

国际预定:

val ibSQL = "select expression from itcast_classify_rule

where flight_type="FlightTypeEnum.International.id" and

operation_type= " Behavior TypeEnur ,Book.id

至此 SQl 语句写完并且完善,整体步骤并不麻烦,但是需要一定的工作量

2.定义一个接收数据的字段

借用前面的字段 field,并修改为 expression,代码为:

val field="expression”

3.在数据库中读取数据

调用:val filterRuleList=QuenyDB, queryData(sql,field)方法,读取数据依旧是分四种情况进行分别读取,field 是一样的,唯一不一样的就是 sql 语句,具体代码及解释如下:

国内查询规则读取:

val nqRuleList= QueryDe.queryData(nqsQL,field)

val nqRuleList 表示定义一个变量进行接收

国际查询规则读取:

val iqRuleList= QueryDB.queryData(iqsQL,field)

国内预定规则读取:

val nbRulelist= QueryD8.queryData(nbsQL,field)

国际预定规则读取:

val ibRuleList=QueryDB.queryData(ibsQL,field)

截至目前,四种业务场景的规则已经读取完毕了。

4.将四种业务的规则封装到一个 Map 内

数据拿取完毕后可以分次返回,但是不太友好,可以通过一定的方法将四种方法一次性返回,即需要把四个结果封装到一个 map 里面,然后把 map 返回,即可一次性拿到四个业务场景,后续在计算的时候可以再把四个业务场景迭代出来。

定义为:val RuleMaps 并实例化为 val RuleMaps=new Java util.HashMap[]()。达到监视效果还需要定义 key 和value,key 定义为 string,value 是真正的数据,规则会有多个,因此 value 的数据类型定义为ArrayBuffer,ArrayBuffer 中里为 string 类型,即定义 Map 的代码为:

val RuleMaps=new

util.HashMap[string,ArrayBuffer[String]]()

下面把四个类型的数据分别添加到Map里,具体代码为:

国内查询:

RuleMaps.put("nqRuleList",nqRuleList)

其中 key 为 nqRuleList,value 也为 nqRuleList

国际查询:

RuleMaps.put("iqRuleList",iqRuleList)

国内预定:

RuleMaps.put("nbRuleList",nbRuleList)

国际预定:

RuleMaps.put("ibRuleList","ibRuleList)

5.将 Map 返回

把语句:RuleMaps 放在最后一行即可将其返回。

至此数据预处理的读取规则设置完毕。返回后将数据类型补全,在程序的前面把数据库读取过来的同时要设置一个接收,接收仍然使用 RuleMaps,代码为:

val RuleMaps=AnalyzeRuleDB.queryRuleMHap()

表示把数据库读到程序里面,然后将规则添加到广播变量里,即调用 SC,代码为:@volatile val

broadcastRuleMaps=sc.broadcast(RuleMaps)四种业务的规则已经读取到程序当中,同时也添加到了广播里面。

相关文章
|
7月前
|
数据采集 数据挖掘 数据处理
数据清洗的主要步骤包括**理解数据、处理重复值、处理空缺值、处理异常值、数据标准化和数据收集
【4月更文挑战第3天】数据清洗的主要步骤包括**理解数据、处理重复值、处理空缺值、处理异常值、数据标准化和数据收集
337 2
|
25天前
|
存储 机器学习/深度学习 数据可视化
数据集中存在大量的重复值,会对后续的数据分析和处理产生什么影响?
数据集中存在大量重复值可能会对后续的数据分析和处理产生多方面的负面影响
49 10
|
1月前
|
传感器 存储 索引
如何解决 analogRead()函数读取到的模拟值不准确的问题
在使用analogRead()函数时,若读取到的模拟值不准确,可以通过校准ADC、增加采样次数取平均值、使用外部参考电压或检查电路连接等方式来提高读取精度。
|
5月前
|
并行计算 监控 Serverless
函数计算操作报错合集之出现了设备不匹配的问题,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
7月前
|
机器学习/深度学习 缓存 文字识别
印刷文字识别产品使用合集之标注阶段设定了两个独立的字段,但在返回的信息中却合并成了一个字段如何解决
印刷文字识别(Optical Character Recognition, OCR)技术能够将图片、扫描文档或 PDF 中的印刷文字转化为可编辑和可搜索的数据。这项技术广泛应用于多个领域,以提高工作效率、促进信息数字化。以下是一些印刷文字识别产品使用的典型场景合集。
|
数据采集 机器学习/深度学习 算法
②数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
830 0
②数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
|
Linux 测试技术 数据处理
R语言丨根据VCF文件设计引物,自动识别两样本差异SNP位点,调用samtools获取上下游参考序列,快速得到引物序列
R语言丨根据VCF文件设计引物,自动识别两样本差异SNP位点,调用samtools获取上下游参考序列,快速得到引物序列
|
PHP
php清洗数据实战案例(4):按照关联数组相同值名称进行筛选后对不同的指标予以合并计算的解决方案
php清洗数据实战案例(4):按照关联数组相同值名称进行筛选后对不同的指标予以合并计算的解决方案
68 0
|
数据可视化
【数据篇】34 # 如何处理多元变量?
【数据篇】34 # 如何处理多元变量?
161 0
【数据篇】34 # 如何处理多元变量?
|
数据采集 消息中间件 存储
数据预处理-航线类型操作类型目标与思路|学习笔记
快速学习数据预处理-航线类型操作类型目标与思路
129 0
数据预处理-航线类型操作类型目标与思路|学习笔记