简介:面向《数据采集与预处理》课程的PDF教学教案,围绕“认识数据预处理技术”任务展开,适用于课堂讲授数据清洗、数据集成、数据变换与数据归约等关键环节。内容先概括数据预处理的目标与常见问题,再依次讲解数据采样、数据清理、数据集成、数据归约、特征选择与特征提取等技术要点,其中缺失值补齐、噪声平滑、实体识别、维归约等技术细节均有简明说明。后半部分专门演示Pig和Kettle两个工具的环境搭建,涵盖下载解压、重命名、配置环境变量及验证安装,便于教学演示与课堂同步实操。全篇按知识准备与任务实施两段组织,步骤完整,适合作为高校数据科学相关课程的辅助教案,也便于学生课后对照练习工具部署与预处理操作。资源共1个文件,为PDF格式,整包约149KB,体积精简,便于快速下载与分发;目前已有332人学习下载。
1. 数据采集之后为什么必须接数据预处理:脏数据的三副面孔与一条落地路径
做数据采集的人都知道,数据到手只算开始,数据预处理才是决定分析结果下限的那一步。不管数据来自 LabVIEW DAQ 采集卡、注塑机联网上报的工艺参数,还是爬虫抓下来的行情文本,原始数据普遍缺字段、带噪声、格式混乱,直接喂给算法基本都是翻车现场。这份教案把数据清洗、集成、转换、归约、特征选择、特征提取整条链路拆开,每步讲清“到底在解决什么问题”,再布置 Pig 0.17.0 和 Kettle 7.0 两套环境搭建任务收尾。它适合准备实训课的老师,也适合刚把数据采回来、手上有脏数据不知道怎么处理的入门者;照着教案顺序走一遍,基本能把一条从“原始数据”到“可分析数据”的管道搭出来。
2. 数据预处理到底做什么:从采样、清洗到集成、归约与特征提取
教案把数据预处理的定义写得相当克制:在数据挖掘以前,先对原始数据进行清理、集成、转换、离散、归约、特征选择和提取等一系列处理,达到挖掘算法进行知识获取所要求的最低规范和标准。翻译成大白话是:把不能直接进模型的原始数据,洗成模型能认识的样子。数据采样、数据清理、数据集成、数据归约、特征选择、特征提取这几个动作,才是数据预处理的主体,而不是很多人以为的“删掉空行”那么简单。
2.1 采样是第一步:加权、随机、分层各自解决什么问题
教案把数据采样列为数据预处理的第一类常见问题,并划分成加权采样、随机采样、分层采样三类。随机采样最常用,适合数据分布均匀的场景;加权采样给不同样本设置不同的数值系数,让样本呈现希望的相对重要性,比如业务上认定近期数据更重要,就把近期样本权重调高;分层采样针对分布不均衡的数据,控制每一类在样本里的出现频率。
做注塑机故障预测时这个差别尤其明显:良品记录远多于故障记录,如果直接随机采样,故障样本可能只有个位数,模型根本学不到故障特征。分层采样按故障/良品比例分别抽样,保证两类数据都保留足够数量。反过来说,如果一个采集任务里各来源数据都算均衡,随机采样就是性价比最高的选择。Pig 里做采样习惯用 SAMPLE 或 SPLIT 语句,Kettle 里有现成的“取样”步骤,这一步在后续环境搭建里都会碰到。
2.2 原始数据为什么不能直接用:不完整、含噪声、杂乱性三个信号
教案把散乱原始数据的特征归纳成三类:不完整性、含噪声、杂乱性。这三个词对应到工程现场非常具体。不完整性最常见,传感器某段时间没上报,或者爬虫抓页面时字段缺失,数据表里就会出现大片的空值。含噪声则表现为传感器偶尔跳一个尖刺,或爬虫抓来的行情文本混进乱码块。杂乱性更多来自多源数据合并,同一个企业在 A 系统里叫“华东精密”,在 B 系统里叫“华东精密有限公司”,程序一匹配就傻眼。
看到这三种信号,基本上就可以判断该上预处理了。像 NPP 夜间灯光这类遥感数据,从原始影像到可分析栅格,中间的去噪、拼接、裁剪、重投影,本质上就是数据清理和数据转换的组合。也就是说,数据预处理并不是某一类数据的专属流程,而是所有数据在进入分析前的必经之路。
2.3 数据清理与数据集成:补齐缺失值、平滑噪声、解决四类冲突
数据清理是教案着墨最多的部分,核心是三类操作:填补遗漏的数据值、平滑有噪声数据、识别或除去异常值。处理不完备数据集的方法分为删除元组和数据补齐两大类,其中补齐方法非常多,教案一口气列了八种。直接看对照表更清楚:
| 方法 | 思路 | 好用在哪 | 注意什么 |
|---|---|---|---|
| 删除元组 | 把有缺失属性的记录整体删掉 | 缺失比例低时最简单 | 缺失多时会丢大量信息 |
| 人工填写 | 人工逐条补 | 关键字段少、数据量小时准确 | 成本高,不适合大表 |
| 特殊值填充 | 用“unknown”等占位符填充 | 类别字段常用,保留缺失语义 | 模型可能把占位符当成真实类别 |
| 平均值填充 | 用该列均值填充缺失值 | 数值字段快速处理 | 受异常值影响大,会压低方差 |
| 热卡填充 | 找最相似完整记录的值来补 | 比平均值更贴近真实分布 | 需要定义相似度,计算量偏大 |
| k近邻法 | 找k个近邻样本加权填充 | 精度较高,工程常用 | 数据量大时计算开销明显 |
| 所有可能值填充 | 分别填充所有可能取值再建模 | 信息保留完整 | 要跑多个模型,费算力 |
| 组合完整化方法 | 多种方法组合着补 | 工业项目最常见做法 | 需要验证每种方法的补全效果 |
| 回归 | 用其他字段回归预测缺失值 | 字段间相关性较强时效果好 | 容易过拟合,需要交叉验证 |
平滑有噪声数据的常用方法则是分箱、回归、聚类。分箱把数据分成若干箱,用箱均值或箱中位数替代箱内数据;回归用拟合曲线抹平波动;聚类把类似的值聚成群或簇,直观地讲,落在簇集合之外的值就被视为离群点。后面做 Kettle 转换时,“过滤记录”步骤就是在做这类清洗动作。
数据集成解决的是多数据源合并的一致性问题,教案归纳为四类:实体识别、冗余和相关分析、元组重复、数据值冲突的检测与处理。实体识别判断两个来源里的记录是不是同一个实体;冗余处理去掉重复字段;元组重复解决重复记录;数据值冲突最典型的是 A 表单价是含税价、B 表单价是不含税价,合并前必须约定统一口径。这些在注塑机数据采集联网场景里会集中爆发——不同车间的设备协议不同、字段命名不同,不先做集成,汇总表根本没法用。
2.4 数据归约、特征选择与特征提取:减少数据量但不丢信息
数据归约策略包括维归约、数量归约和数据压缩。维归约减少列的数量,删掉冗余属性或做属性合并;数量归约用替代的、较小的数据表示形式替换原数据,比如用聚类中心代表一组样本;数据压缩则通过编码方式降低存储。归约的目的是在尽量不损失信息的前提下,把数据量压下来,减少后续算法的计算压力。
特征选择和特征提取容易被当成同一件事,但教案分得很清楚:特征选择是从原始特征里挑出最有代表性的子集,有过滤式、封装式、嵌入式三种类型;特征提取是利用已有特征构造一个较低维数的特征空间,把原始特征中有用的信息映射到少数几个特征上,忽略不相干信息。三者的对比如下:
| 类型 | 评估依据 | 特点 | 典型场景 |
|---|---|---|---|
| 过滤式 | 统计指标打分,不依赖模型 | 速度快,忽略特征间组合关系 | 高维数据快速初筛 |
| 封装式 | 用模型效果评价特征子集 | 精准,但计算开销大 | 特征数较少的小数据集 |
| 嵌入式 | 模型训练过程中自动选特征 | 兼顾效果与效率 | L1正则、决策树分裂 |
特征提取在工程里的例子很多,PCA 主成分分析是典型做法,高分二号影像在 QGIS 里做预处理时的波段组合与主成分变换也属于这一类。除此之外,教案在教学目的里还提到数据转换,归一化、离散化、独热编码都在这个范畴,通常在归约和特征选择之前完成。
理论这段有个关键理解:Pig 和 Kettle 做的事,其实就是把上面这套数据清理、转换、归约的逻辑落到具体工具上。Pig 偏向把清洗转换写成脚本批量执行,适合处理大文件;Kettle 偏向图形化拖拽,适合看清每一步的数据流向。接下来两章分别把这两个环境搭起来。
3. Pig 0.17.0 环境搭建:从源码包解压到 Grunt 跑通一条加载链路
教案在“任务实施”部分把 Pig 的搭建分成下载解压、重命名、配置环境变量、验证四步。这套环境是后续跑数据清洗脚本的基础,也是理解 Pig Latin 语法的最低配置。Pig 本身是跑在 Hadoop 之上的脚本语言工具,但单机教学环境可以用 local 模式运行,不依赖 HDFS 集群也能完成清洗逻辑的练习。
3.1 下载源码包还是预编译包:先决定省不省这一步
教案原文要求下载 pig-0.17.0-src.tar.gz,注意这个包是源码包。src 版需要自己用构建工具编译,在教学电脑上能跑,但等待时间长,还可能缺依赖。实际操作时我更建议直接下载同版本的预编译 bin 包,文件名通常不带 -src,解压即用。如果已经按教案下了 src 包,也有一条路可以走。
# 方案A:按教案用源码包,解压到 /usr/local sudo tar -zxf pig-0.17.0-src.tar.gz -C /usr/local cd /usr/local # 重命名,缩短路径,后续配置变量更方便 sudo mv pig-0.17.0-src pig # 方案B:教学环境建议直接用预编译包 # sudo tar -zxf pig-0.17.0.tar.gz -C /usr/local # cd /usr/local && sudo mv pig-0.17.0 pig-C /usr/local指定解压目标目录,避免文件散落在当前目录。重命名成pig是为了统一路径,后面环境变量里写/usr/local/pig比写pig-0.17.0-src短得多,也避免版本号写错导致路径失效。如果选了方案A,源码包还需要额外做一次构建,常见做法是在/usr/local/pig目录下执行 Maven 打包命令,构建时间取决于机器性能,这也是我推荐教学直接用 bin 包的原因。
3.2 配置 PIG_HOME 与 PATH:环境变量这一步决定能不能找到 pig 命令
环境变量配置是新手最容易出错的环节。教案给出的路径是修改~/.bashrc,这个文件是当前用户 shell 的启动配置。打开文件后,在末尾追加两行。
# 编辑当前用户的 shell 配置文件 sudo vim ~/.bashrc文件末尾追加以下内容并保存:
# PIG_HOME 指向解压根目录,不是 bin 目录 export PIG_HOME=/usr/local/pig # PATH 里需要追加的是 $PIG_HOME/bin,而不是 PIG_HOME 本身 export PATH=$PIG_HOME/bin:$PATH保存后执行命令让配置在当前会话生效:
source ~/.bashrc有两个细节值得单独说明。第一,PIG_HOME必须指向/usr/local/pig这个根目录,而不是/usr/local/pig/bin,因为后续脚本会基于PIG_HOME去拼bin、lib等子目录。第二,source只对当前终端窗口生效,新开的终端会自动加载~/.bashrc,不需要重复 source。这里有个隐含坑位:如果用sudo vim改的是 root 用户的.bashrc,而当前登录的是普通用户,改完怎么 source 都没用,后文避坑章节会展开。
3.3 验证安装并跑通 Grunt:一条 LOAD 到 DUMP 的最小链路
环境变量配好后,第一步验证版本号是否能正常输出。在终端输入:
# 输出版本号,确认 pig 命令已进入 PATH pig -version能打印出版本信息,说明命令可以被找到。接下来建议进入 Grunt 交互模式,这是 Pig 提供的一个类似 shell 的执行环境,后续写清洗脚本都在这里面调试。
# 进入 Grunt,-x local 指定本地模式,不依赖 HDFS 集群 pig -x local在 Grunt 提示符下执行一段最小数据处理链路:
-- 读取本地 CSV 文件,逗号作为字段分隔符 orders = LOAD '/home/user/orders.csv' USING PigStorage(',') AS (id:int, amount:double); -- 过滤掉 amount 为空的脏数据,对应教案里的数据清理 clean_orders = FILTER orders BY amount IS NOT NULL; -- 按金额降序排列 top_orders = ORDER clean_orders BY amount DESC; -- 打印到屏幕验证结果 DUMP top_orders;这段脚本把教案里的数据清理落到了真实语法上:PigStorage(',')指定分隔符,AS后面定义字段名和类型,FILTER ... IS NOT NULL把空值记录过滤掉,ORDER BY做排序,DUMP打印结果。local模式下路径写本地文件的绝对路径,如果将来连 Hadoop 集群,加载路径需要换成hdfs://开头的地址。这一步跑通,说明 Pig 安装真正可用,而不只是命令能敲出来。
4. Kettle 7.0 环境搭建:pdi-ce-7.0.0.0-25 从解压到 spoon.sh 启动
Kettle 是图形化 ETL 工具,教案安排的环境任务是 pdi-ce-7.0.0.0-25 这个社区版。它和 Pig 正好互补:Pig 写脚本适合成批跑、容易自动化;Kettle 拖拽图形化,适合看数据每一步的流向,也适合给初学者建立“清洗管道”的直观印象。Kettle 解压后的目录叫># 解压到 /usr/local sudo unzip pdi-ce-7.0.0.0-25.zip -d /usr/local # 进入目录并重命名 cd /usr/local sudo mv>sudo vim ~/.bashrc
追加:
# KETTLE_HOME 指向解压根目录 export KETTLE_HOME=/usr/local/kettle # 把 Kettle 根目录加进 PATH,方便直接执行 spoon.sh export PATH=$KETTLE_HOME:$PATH保存后 source 并启动:
source ~/.bashrc # 切换到 kettle 目录启动图形界面 cd /usr/local/kettle ./spoon.sh如果能弹出 Kettle 主界面,环境搭建就基本成功。但工程上启动 Kettle 之前我一般会先改一个参数:JVM 内存。Kettle 默认的堆内存非常保守,数据量稍大就会卡死。打开spoon.sh找到PENTAHO_DI_JAVA_OPTIONS。
# 编辑启动脚本 cd /usr/local/kettle vim spoon.sh找到类似下面的配置,把默认值调大:
# 默认一般是 -Xmx512m,改到 1G 起、4G 封顶 PENTAHO_DI_JAVA_OPTIONS="-Xms1024m -Xmx4096m"-Xms1024m表示 JVM 启动时申请 1G 初始堆内存,-Xmx4096m表示最大堆内存 4G。改成这个配置后,处理几十万行的转换才不会频繁触发 Full GC。如果机器本身只有 8G 内存,-Xmx不建议超过物理内存的一半,否则系统其他程序会被挤爆。修改完成后必须重启spoon.sh,改完不重启不会生效。
4.3 用 Kettle 做第一个转换:把 CSV 清洗后输出到 Excel
环境跑通后,建议立刻做一个最小转换,把教案里的数据清理步骤可视化出来。操作流程如下:
- 启动 Kettle,菜单选择“文件 → 新建 → 转换”。
- 左侧面板展开“输入”分类,把“CSV 文件输入”拖到画布。
- 双击该步骤,设置要读取的 CSV 文件路径、分隔符,编码明确选 UTF-8,避免中文乱码。
- 从“转换”分类里拖出“过滤记录”步骤,设置过滤条件,比如过滤掉金额为空或小于 0 的记录,这一步对应教案中的数据清理。
- 再拖一个“Excel 输出”步骤,把过滤后的数据接到输出端。
- 用鼠标在步骤间连线,数据流方向从 CSV 输入指向过滤记录,再指向 Excel 输出,最后点工具栏“运行”。
连线在 Kettle 里叫 Hop,表示数据从一个步骤流向另一个步骤。这个转换完成后保存成.ktr文件,如果以后要走命令行调度,直接用kitchen.sh执行对应作业即可。图形化的好处是每一步都能预览数据,调试清洗逻辑比纯脚本直观得多,这也是 Kettle 在教学场景里的核心价值。
5. 常见问题与排查:Pig 和 Kettle 搭建中的五个高频坑
环境搭建的坑主要集中在路径、版本和数据编码三类。以下五条是我在教学和项目里反复遇到的,每条都按现象、原因、解决的顺序拆开。
5.1 找不到命令与改完不生效
现象1:安装完成后输入pig或spoon.sh,终端提示command not found。 原因1:PATH没有包含对应 bin 目录,或者环境变量写错了位置。比如把PIG_HOME直接写成/usr/local/pig/bin,导致$PIG_HOME/bin实际变成/usr/local/pig/bin/bin。 解决1:先检查当前生效的变量值,确认问题出在哪。
# 查看 PIG_HOME 实际指向 echo $PIG_HOME # 查看 PATH 里是否有 pig 的 bin 目录 echo $PATH | grep pig如果$PIG_HOME为空,回去检查.bashrc里的 export 是否写对;如果PIG_HOME对但 PATH 里没有,检查 export 那行是不是漏了$PIG_HOME/bin。改完记得 source。
现象2:source ~/.bashrc后当前窗口能用,新开终端又失效。 原因2:export 写到了别的 shell 配置文件,或者用sudo vim修改的是 root 用户的家目录配置,当前登录用户根本没加载到。 解决2:先执行whoami确认当前用户,再确认编辑的是当前用户的~/.bashrc。普通用户不要用 sudo 去改 root 的配置文件,改完一定不生效。
5.2 版本不匹配:Hadoop/JDK 与工具对不上
现象:pig -version能正常输出,但加载 HDFS 路径时报出一堆 ClassNotFoundException;或者spoon.sh双击后没反应、闪退,控制台输出UnsupportedClassVersionError。 原因:Pig 0.17.0 是 2017 年左右的版本,默认匹配 Hadoop 2.x 和 JDK 8;Kettle 7.0 同样要求 JDK 8。机器上装的是 JDK 11 或 17,字节码版本不兼容,工具就跑不起来。 解决:先确认 Java 版本。
java -version如果不是 JDK 8,安装一个 JDK 8 并设置JAVA_HOME指向它。需要连集群时,确认 Pig 版本与集群 Hadoop 版本匹配;如果只是做教学练习,建议直接pig -x local走本地模式,绕开大部分集群兼容问题。Kettle 同理,装好 JDK 8 后spoon.sh基本就能正常弹窗。
5.3 数据侧细节:中文乱码与 spoon 卡死
现象1:Kettle 里读取 CSV 文件后,中文字段全是乱码,过滤条件也匹配不上。 原因1:CSV 文件输入步骤没有显式设置文件编码。UTF-8 的文件被按系统默认编码(中文 Windows 通常是 GBK)解析,中文字符自然全乱。 解决1:在“CSV 文件输入”步骤里的“编码”字段,显式改成 UTF-8;如果源文件本身是 GBK 生成的就选 GBK,以源文件的真实编码为准。这个坑在数据清洗任务里出现频率极高,教案里没细写,但实际一跑准会遇到。
现象2:spoon.sh启动后长时间卡在 Logo 界面,或者跑大转换时界面假死、报 OutOfMemoryError。 原因2:Kettle 默认 JVM 堆内存太小,编辑器的默认值往往只有 512MB,转换步骤一多,内存立刻不够用。 解决2:按 4.2 节改PENTAHO_DI_JAVA_OPTIONS,将-Xmx调大。机器内存紧张时控制在物理内存一半以内。注意改完必须完全关闭 Kettle 再重启,只重开窗口不会加载新配置。
6. 留给自己的验收习惯:搭建后先跑通三条命令
环境搭完不是看图标能打开就算成功。我一般会强制自己跑三条命令做最小验收,每条命令都对应验证一个关键组件。
# 1. 确认 Java 版本与工具匹配(Pig 和 Kettle 都需要 JDK 8) java -version # 2. Pig 端到端跑一条最小链路,-e 表示直接执行脚本不进入交互界面 pig -x local -e "a = LOAD '/tmp/a.csv' USING PigStorage(',') AS (x:int,y:int); DUMP a;" # 3. Kettle 命令行执行器能正常启动并输出版本 /usr/local/kettle/kitchen.sh -version三条命令对应的验收标准如下:
| 命令 | 预期结果 | 对应组件 |
|---|---|---|
java -version | 输出 Java 版本信息,建议为 1.8 | JDK |
pig -x local -e "…" | 打印出/tmp/a.csv中的数据 | Pig |
kitchen.sh -version | 输出 Kettle 版本号 | Kettle |
这个顺序是有讲究的。Java 不对,后面两个工具根本跑不起来,先验证 Java 能省掉后面排查的大半时间。Pig 用-e参数可以直接执行一段脚本而不进入交互界面,适合做无人值守验证;如果执行时提示路径不存在,先创建/tmp/a.csv并写入两行逗号分隔的整数。Kettle 用kitchen.sh而不是spoon.sh,是因为命令行执行器不弹 GUI,在服务器上也能测,输出版本号即代表整个 Kettle 环境可启动。如果不想用命令行,那就打开一次spoon.sh主界面再关掉,效果相同。
从那以后,我每次在教室或新机器上搭完环境,都强制把这三条命令走一遍,五分钟左右就能确认工具是真能干活,而不是“看起来装上了”。数据预处理理论的笔记可以慢慢做,环境落地这件事,一次跑通最省心。希望帮到你。
本文还有配套的精品资源,点击获取