本次数据清洗场景:
根据数据库表imgs【记录有图片基本信息,和相应图片路径】记录清洗出对应图片信息(包括:briefImg[简图]/fullImg[全图])以及每天的csv文件。
目标目录存在较多各种类型的图片 这里只需要清洗出简图和全图
分析:
本次操做基本不涉及数据比如图片或者视频等多媒体数据的解析等操做 主要是数据抽取和文件cp,故采用shell脚本的方式进行数据清洗
缺点:脚本不易调试,出错不易定位,需要一定的脚本指令基础,由于自身知识限制,目前未在性能监控等方面做相关学习 这里只记录实际操做,未作较多性能分析。
安排:
早期可以一次性把 开始数据清洗之前的数据全部清洗 分批进行处理 后期可以按照数据量和具体业务分析 以天为单位或者星期为单位增量清洗
原始数据分析:
原始目录imgs 下包含系统中各种图片信息 较混乱。图片按照日期存放,一天一个目录。观察数据 会发现 0:00左右的图片 可能会存放在下一天的目录中
以下步骤展示一天为单位的增量清洗,均在linux系统下操做
步骤一、从imgs表中导出图片信息数据生成csv文件同时作为图片清洗的依据
注意:服务器采用mysql
mysql -N -uroot -proot security_pk -e "select CONCAT(id,'|',timestamp,'|', briefImg,'|',fullImg,'|',from_unixtime(timestamp,'%Y%m%d'))from imgs where from_unixtime(timestamp,'%Y%m%d')='20180701' " > /home/imgs /csv_img_backup/input/imgs20180701.txt
查询每一天的增量数据 并且将查询结果写入备份文件imgs20180701.txt,该文件按日期备份
由于mysql的输出文件 存在首尾行分割符,每行不同字段间存在较多空格(表字段长度)这里通过sed 指令来去掉首尾行以及每行的空格
sed -i '1d' /home/imgs /csv_img_backup/input/imgs20180701.txt
sed -i '$d' /home/imgs /csv_img_backup/input/imgs20180701.txt
sed -i 's/\s\+//g' /home/imgs /csv_img_backup/input/imgs20180701.txt
这里不对原始数据做数据内容的处理,清理完后数据的格式就比较整洁紧凑了。
一般项目上会要求转换成csv格式保存,这里同样将imgs20180701.txt文件备份一份csv文件。
awk -F"|" '{print $2","$3","$4","$5 >>"/home/imgs /csv_img_backu/output/CSV/"$6".csv"}' imgs20180701.txt
验证数据准确性
head /home/imgs/csv_img_backup/input/ imgs20180701.txt
tail /home/imgs/csv_img_backup/input/ imgs20180701.txt
wc –l /home/imgs/csv_img_backup/input/ imgs20180701.txt
和具体数据库表:imgs中数据比较
将csv 文件 scp 到备用服务器,在备用服务器指定目录执行 ***/new/CSV/20180701.csv
scp 源服务器用户@源服务器ip:文件目录 备用服务器存放文件的目录
至此步骤一算是整体完成
步骤二,一般资源所在服务器 运行着业务系统,大量的cp操做会严重影响服务器io性能,同时抽取的文件会同样占用大量磁盘空间,故考虑可以将日期20180701下的图片数据拷贝到备用服务器做相关抽取备份操做,后续需要用到数据去该服务器获取(该步骤不是必须)
通过scp指令可以完成该操作
建议指令在备用服务器执行,减少源服务器的压力 ****/old/ZIP/
scp 源服务器用户@源服务器ip:文件目录 备用服务器存放文件的目录
考虑到文件拷贝操做可能会消耗一段时间,可以将该指令设置为后台执行。
一般想到的可能是nohup,但scp过程通常不是免密的,执行过程需要用户输入源服务器用户密码,所以采用 bg和disown 方式实现指令后台执行,
这里可以了解下:
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程,要做的就是让该进程的父进程不在是当前终端会话
具体操做:
- 执行scp指令
- ctrl+z 暂停该指令,jobs 可以查看到当前后台指令
- bg %1 其中1—对应指令的job序号 设置scp指令后台运行,jobs 查看执行状态
- 方式回话超时或者终端关闭导致scp指令关闭,执行disown –h %1,修改父进程,可以ps –ef | grep scp 查看 此时父进程为 1 也就是系统运行进程。。。
等待scp 结束,可大概估算下时间 du –sh ./2018-07-01 查看目录./2018-07-01大小
df –h ./ 查看当前目录磁盘空间
步骤三:源数据中抽取简图和全图文件
步骤一步骤二已经准备好了基本数据 后续开始抽取和打包操做, 抽取后的数据同样按照天为单位 ***/new/ZIP/20180701.tar
- 修改csv文件face/full path
sed -i 's|/home/imgs/|***/new/ZIP/20180701/|g' /***/new/CSV/ 20180701.csv
2.根据a中csv文件抽取 简图/全图
指令类似下面操做 $num num为 awk分割行数据后的索引,从1开始,其中0代表整行数据
nohup awk -F"," '{print $3}' 20180701.csv |awk -F"/" '{print "mkdir -p/***/new/ZIP/"$8"; cp -f /***/old/"$8"/"$9 " "$0}' |sh > 20180701.run 2>&1 &
3.将抽取的目录打成tar包不压缩
tar –cvf ***tar ./20180701/
over....