大数据预处理kettle课堂笔记
- 第一章 数据预处理概述
- 第二章 Kettle工具的基本使用
- 第三章 基于kettle的书导入与导出
- 第四章 数据清理
- 第五章 Kettle的作业设计
- 第六章 构建数据仓库
- 第七章 基于Pythond的数据导入与导出
- 第八章 基于Python的数据整理
第一章 数据预处理概述
1. 数据背景--影响数据质量的因素
* 准确性,完整性,一致性 从采集角度看
* 相关性,时效性 从应用角度看
* 可信性,可解释性 从用户角度看
2. 数据处理的目的
* 重要性
* 数据预处理是数据挖掘中必不可少的关键一步,更是进行数据挖掘前的准备工作。
* 目的
* 通过对数据格式和内容的调整,使数据更符合挖掘的需要
* 保证数据挖掘数据的正确性和有效性
* 达到改进数据的质量,提高数据挖掘过程的准确性和效率
* 数据预处理的流程
* 数据清理-->数据集成-->数据变换-->数据归约 **可非顺序使用**
3. 数据清理
1. 数据清理的对象:脏数据(由于重复录入,并发处理等不规范的操作,导致产生不完整,不准确的,无效的数据)
2. 数据清理的方法
* 缺省值处理
* 忽略元祖,人工填写缺失值,使用一个全局变量填充缺失值,使用属性的中心度量填充缺失值,使用最可能的值填充缺失值。
* 噪声数据
* 噪声数据是被测量变量的随机误差或方差。
* 分箱
- 例:8、24、15、41、6、10、18、67、25。
- 分为深度为3的3个箱子,每个箱子采用不同的方式来平滑数据:
- 箱1采用均值法,箱2采用中位数,箱3采用边界光滑。
- 解析:
- 排序:6,8,10,15,18,24,25,41,67
- 分箱:
- 箱1:6、8、10
- 箱2:15、18、24
- 箱3:25、41、67
- 分别采用三种不同的分箱法求出平滑存储数据的值:
- 平均值:8 箱1:8、8、8
- 中值:18 箱2:18、18、18
- 边界值: 箱3:25、25、67
3. 数据集成
1. 定义
* 将相互关联的分布式异构数据源集成到一起,使用户能够以透明的方式访问这些数据源。
4. 数据变换
1. 目的:将数据变换或统一成易于进行数据挖掘的数据存储形式,使得挖掘过程可能更有效。
2. 数据集成的方法
* 最小--最大规范化
- v'=v-minA/maxA-minA * (new_maxA-new_minA)+new_minA
* z-score规范化
- v'=v-meanA/standard_devA
* 小数定标规范化
- v'=v/10^j
5. 数据规约
* 维规约、数量规约、数据压缩
* 注意:冗余数据的删除既是一种数据清理形式,也是一种数据规约。
6. 数据预处理工具
* kettle、Python
第二章 Kettle工具的基本使用
1. kettle的使用
1. kettle是一个java程序
2. 转换的定义:转换时ETL解决方案中最主要的部分,它负责处理抽取、转换、加载各阶段对数据行的各种操作。
3. 转换的组成:步骤、跳、注释。
* 步骤的关键特性
- 步骤需要有唯一的名字
- 每个步骤都会读、写数据行
- 步骤之间通过跳进行数据行的单项传输
- 大多数的步骤都可以有多个输出跳
- 在运行转换时,一个线程运行一个步骤,所有步骤的线程几乎同时运行
* 转换的跳
- 步骤之间带箭头的连线,跳定义了步骤之间进行数据传输的单向通道。
- 从程序执行的角度看,跳实际上是两个步骤线程之间进行数据行传输的缓存
- 从功能角度来看,转换有明确的起点步骤和终点步骤
* 数据行
- 数据以数据行的形式沿着步骤移动。一个数据行是零到多个字段的集合。
2. 第一个转换案例
1. 表输入
* 可以指定数据库中读取指定关系表的数据
2. 参数配置
* 环境变量配置 全局性
* 命名参数配置 局部性
第三章 基于kettle的书导入与导出
1. 基于文件数据的导入与导出
1. 文本文件
* CSV文件 CSV文件输入
* 固定宽度文件 固定宽度文本文件输出
2. Excel文件
* Excel文件输入
- 结构化和非结构化表格数据
* 文本文件输出
3. XML文件
* XML是一种遵循规范的半结构化的文本文件
* Get data from XML、XML output
2. 基于数据库的数据导入与导出
1. 分类
* 关系型数据库
- MySql、Oracle、SQL Server、DB2
* 菲关系型
- Hbase
2. 数据库连接
* 实际是数据库连接的表述:也就是建立实际连接所需要的参数
* 一般选项卡
- 主机名称
- 数据库名称
- 端口号
- 用户名和密码
3. 基于Web数据的导入与导出
* HTTP Client
- 发出一个HTTP GET请求或者访问HTML页面,调用此步骤里的URL从Web获取数据
* HTTP Post
- 发出一个HTTP POST请求,调用此步骤里的URL从Web获取数据
* 注意:都是查询类步骤,需要一个输入类步骤来激活(自定义常量)
4. 基于CDC变更数据的导入与导出
1. 数据导入的主要挑战
* 初始数据量大和网络延迟
2. 定义
* 识别出变化的数据并只导入这部分数据被称为变化数据捕获,即CDC
3. 分类
* 侵入性
- 源数据
- 时间戳、自增序列
- 缺点:区分插入和更新操作,多次更新操作,删除操作,实时性
- 基于触发器的CDC
- 定义:当Insert、update、delete等Sql进行执行时,可以出发数据库自有的触发器,并执行某些动作。
- 分类:insert、update、delete
- 优点:可以实时监测到数据的所有变化
- 缺点:需要服务协议或数据库管理员的允许,创建数据库语法不同
- 快照
- 原理:将源数据中的所以数据加载到数据仓库的缓冲区形成源数据的第一个快照版本,下一次需要同步时,再将源数据加载到数据仓库的缓冲区形成源数据的第二个快照版本。
* 非侵入性
- 日志
- 基于日志的方式是最高级的、最没有侵入性的CDC方法。数据库会把插入、更新、删除操作都记录到日志里。
第四章 数据清理
1. 数据清理概述
1. 数据清理
* 试图监测和去除数据集中的噪声数据和无关数据,处理遗漏数据,去除空白数据域和知识背景下的白噪声,解决数据的一致性、唯一性问题,从而达到提高数据质量的目的。
2. 数据清理的重要性
* 数据清洗在整个分析过程中时不可或缺的一个环节,在实际操作中,它更占据分析过程的50%--80%的时间。
3. 数据清理的步骤
* 转换目录,脚本目录,检验目录
2. 字符串清理
1. 主要步骤
* 字符串剪切、字符串替换、字符串操作
3. 字段清理
1. 主要步骤
* 列拆分为多行、拆分字段、合并字段、字段选择
4. 数据效验
* 数据效验、信用卡效验、电子信箱效验、XML文件效验
* 功能单一:针对性很强
5. 数据排重
1. 产生重复数据的原因
* 数据录入出错、数据不完整、数据缩写,系统对数据表示不尽相同
2. 分类
* 完全重复数据:两个数据行的数据完全一致
* 不完全重复数据:客观上表示现实世界中的同一实体,但由于表达方式不同或拼写错误等原因,导致数据存在了多条重复记录。
3. 去除完全重复数据的两个步骤
* 去除重复数据-->针对有序记录
* 唯一行(哈希值)
6. 利用脚本进行数据清理
1. 脚本步骤
* JAVAScript代码,正则表达式,公式,Java代码,用户自定义Java类
第五章 Kettle的作业设计
1. 作业的概念及组成
1. 概念
* 一个作业包含一个或多个作业项,这些作业项以某种顺序来执行。
* 作业执行顺序由作业项之间的跳(Hop)和每个作业项的执行结果来决定。
2. 组成
* 作业项
-概念:作业的基本组成部分,以图表的方式图形化展示。
- 和步骤的区别:
- 影子拷贝
- 作业项之间传递一个结果对象
- 可以并行执行
* 作业跳
- 概念:作业项之间的连接线,定义作业的执行路径。
- 判断方式:
- 无条件的
- 当结果为真
- 当结果为假
- 两种状态:Enabled可用,Disabled不可用
* 注释
- 增强了程序的可读性,减低维护成本
2. 作业的执行方式
1. 三种方式
* 回溯算法、多路径和回溯、并行执行
3. 作业的创建及常用作业项
1. 创建
* 新建-->保存 名称 路径-->文件格式*.kjb
2. start
* 作业的起点,有且仅有一个
* 设置作业的定时调度
3. 作业“作业项”
* 调用预定义的作业
4. “转换”作业项
* 调用预定义的转换
4. 变量
1. 概念
* 变量是一个任意长度的字符串值,它有自己的作用范围
2. 初始化变量的两种方法
* 系统内置,用户自定义
3. 变量的使用
* ${变量名} %%变量名%%
* Ctrl+Alt+空格-->显示所有变量
5.监控
1. 两种方式
* 日志:针对执行过程的信息反馈
* 邮件:通过发送邮件的方式通知管理员作业的执行情况
2. 日志级别
* Nothing,Error,Minimal,Basic,Detailed,Debug,Rowlevel
第六章 构建数据仓库
- 四个特征
* 面向主题、数据时集成的、数据时不可更新的、数据是随时间不断变化的
- 构成
* 维度表:存放属性
* 事实表:存放业务数据
1. 维度表
1. 构成维度表的键
* 业务主键
* 代理键
2. 管理这两种键,需要做一下工作
* 确定业务主体对象,确保业务主键的唯一性;
* 判断当前维度表是否存在该业务键,根据业务主键更新维度表或者插入维度表数据;
* 为新插入的维度表行数据生成新的代理键。
3. 业务表的管理
* 确保业务键要唯一
* 对业务主键合并处理
4. 维度表的典型模型
* 星型模型:图例+加载方法
* 雪花模型:图例+加载方法
5. 缓慢变换维度类型
* 类型1:只保留新版本
* 类型2:保存多个历史版本
* 类型3:新纪录+部分关键历史信息
6. 其他类型
* 混合维度:混合使用类型1、2、3
* 生成维度:对一些可以预知的维度一次性先生成
* 杂项维度:包含了多个无法分类和无相关属性的维度情况
2. 事实表
1. 查找维度
* 维护数据完整性、查找维度表代理键、处理数据延迟
2. 事实表的处理
* 事实型事务表
* 是事务粒度的,以单个事务、单个事件为单位,每次事务作为事实表的1行数据,如刷卡一次,会有一条刷卡记录。
* 周期快照事实表
* 是时间周期粒度的,以固定时间周期为单位,每一个时间周期1行数据,如每一天、每一个月的话费支出。
* 累积快照事实表
* 例如订单处理过程,有多个日期:下单日期、发货日期、签收日期等。随着订单的状态改变,时期也在改变。
* 周期快照事实表记录的是确定周期的数据,而累积快照事实表记录的是不确定的周期数据。
第七章 基于Pythond的数据导入与导出
- Pandas
* Series:用于处理一维数据,包含一系列的元素及元素对应的标签(index)。
* DataFrame:用于处理二维数据
1. 导包
* from pandas import Series as 别名
* from pandas import DataFrame as 别名
2. 新建对象--series
* list对象创建
* s = Series([1,3,4,np.nan,7,9])
* 字典创建
* s = Series({'a':1,'b':2,'c':3})
3. 运算
* 简单运算
* s2 = Series([3,8,-5,1], index = ['a','b','c','d'])
s2 * 3
a 9
b 24
c -15
d 3
4. 查看数据
* 查看索引和列名
* df.index
* df.columns
* 使用DataFrame.to_numpy()转化为numpy数据
* df.to_numpy()
* 查看数据的简要统计结果
* df.describe()
* 转置
* df.T
5. CSV文件的导入和导出
1. 文件查看
* Linux:!cat文件名
* Windows:!type文件名
2. 导入函数
* read_csv
* read_table
3. 导入函数的一些基本语法
* 利用sep指定分隔符
df = pandas.read_table('test1.csv', sep=',')
* names函数指定列标签
pd.read_csv('test2.csv', names=['a', 'b', 'c', 'd', 'message'])
* 利用正则表达式来表示复杂分隔符:
pd.read_table('test3.csv', sep='\s+')
* 使用skiprows参数忽略行:
pandas.read_csv('test3.csv', sep='\s+',skiprows=[1])
* 使用nrows参数可以控制读入的行数:
pd.read_csv('test3.csv', sep='\s+', nrows =2)
4. 导入与导出数据
* CSV
* 写入:df.to_csv('foo.csv')
* 读取:pd.read_csv(‘foo.csv’)、pd.read_table(‘foo.csv’)
* Json
* 写入: json.dump()---to_json
* 读取: j = json.load()---read_json
* Excel
* 写入:df.to_excel('foo.xlsx', sheet_name='Sheet1')
* 读取:pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
第八章 基于Python的数据整理
1. 合并
1. Concat
* 理解轴(axis)的含义
0(默认):表示沿着每一列或行标签\索引值向下叠加,增加行;
1:表示沿着每一行或者列标签向右叠加,增加列。
2. merge
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
left
Out[151]:
key lval
0 foo 1
1 foo 2
right
Out[152]:
key rval
0 foo 4
1 foo 5
pd.merge(left, right, on='key')
Out[153]:
key lval rval
0 foo 1 4
1 foo 1 5
2 foo 2 4
3 foo 2 5
2. 整形
1. Stack
* 将数据集的列旋转为行
2. unstack
* 将数据的行旋转成为列