Kettle对非结构化数据进行分类
介绍
对一批文件进行分类,按照类别创建目录,并将文件拷贝到相应的目录下。
场景分析
- 旧NEUOJ的数据库中存在
testcases
表,testcase
表里存储了输入输出数据的文件名和对应的题目号pid
。 - 新NEUOJ的数据库中,
problems
表字段中包含该题在旧数据库中的题目号old_oj_pid
。 testdata/
目录下的文件是旧OJ中的测试数据。现在需要对这些测试数据文件进行分类,分类依据是对应题目在新OJ中的题目号id
,文件拷贝到一个新的目录file/
下。- 假设题目号为
1016
,对应的输入数据为test.in
,则对应的文件路径是file/1001-1100/1016/test.in
。
考虑数据处理的过程。整个流程的思路为:数据输入->路径处理->文件处理。
- 在数据输入阶段考虑需要输入的数据
- 在路径处理的阶段对文件进行分类,确定它的类别。
- 在文件处理阶段可以直接根据设置好的路径进行文件拷贝。
流程图示
最终的流程图分为四个文件,分别是
- 总作业.kjb
总作业包含了整个作业的执行过程。
- 找到题目序号分类,获取路径.ktr
将数据输入和路径处理两个阶段结合在同一个流程中
- 创建文件夹并分类目录.kjb
文件处理阶段,其实进行的步骤只有复制文件。如果源文件不存在,则在拷贝路径处创建一个空白的文件。
- 获取变量.ktr
这个文件被用于创建文件夹并分类目录.kjb
的第一个步骤:获取变量。
这一步相当于是一个接口的转换器,它接收找到题目序号分类,获取路径.ktr
传递过来的结果,将其设置为变量,使得创建文件夹并分类目录.kjb
可以使用这些变量进行文件处理。
说明
总作业
设置执行每一个输入行
设置执行每一个输入行
是kettle实现逐条执行的方法之一。
在总作业中,双击创建文件夹并分类目录
,勾选执行每一个输入行
,它对于找到题目序号分类,获取路径
传递过来的结果,是逐条执行的。
如果不勾选这个选项,在获取变量.ktr
中的设置变量
步骤会同时接收到多个并行数据发送过来的参数,从而报错。
找到题目序号分类,获取路径(数据输入+路径处理)
testcases表输入
:从旧OJ中的testcases
表输入数据数据库查询
:从新OJ中查询old_oj_pid = pid
的行,并返回其id
JavaScript代码
:从JS脚本中将读取到的文件名进行处理,产生新的字段复制记录到结果
:将结果传递到下一个流程
testcases表输入
双击testcase表输入
,可以查看数据库的输入。在这里通过SQL语句筛去了pid为0的非法数据,并将结果按照pid进行了排序。
此处需要修改数据库连接。关于数据库连接的修改,请查看Users.ktr使用文档中关于数据库连接的部分。
数据库查询
双击数据库查询
,可以查看数据库查询的细节。这里将旧OJ的testcases
表中pid
字段与新OJ的problems
字段进行比对。
此处需要修改数据库连接。关于数据库连接的修改,请查看Users.ktr使用文档中关于数据库连接的部分。
JavaScript代码
input_file_name
和output_file_name
是保存在"testdata/"
目录下的文件路径。
newTestInput
和newTestOutput
用于保存拷贝的路径。
firstDictionaryPath
和directoryPath
用于获取分类的目录。
//javascript代码
firstDirectoryPath = "file/" + (parseInt((id-1)/100)*100+1) + "-" + (parseInt((id-1)/100)*100+100);
directoryPath = firstDirectoryPath + "/" + (id) + "/";
newTestInput = directoryPath + input_file_name;
newTestOutput = directoryPath + output_file_name;input_file_name = "testdata/" + input_file_name;
output_file_name = "testdata/" + output_file_name;
例如对于id
为1016
的数据,输入数据文件名为test.in
,输出数据文件名为test.out
。
firstDirectoryPath = "file/1001-1100"
directoryPath = "file/1001-1100"
+ "/1016/"
newTestInput = "file/1001-1100"
+ "/1016/"
+ "test.in"
newTestOuput = "file/1001-1100"
+ "/1016/"
+ "test.out"
(其实这里应该在firstDirectoryPath的末尾加上/
,为了不影响后续作业的运行,暂时不进行修改)
input_file_name = "testdata/test.in"
output_file_name = "testdata/test.out"
复制记录到结果
右键选择查看输入字段
,可以查看从上一个步骤获得的字段。
这些字段将被传递给下一个步骤(创建文件夹并分类目录
->获取变量
->从结果获取记录
)。
创建文件夹并分类目录.kjb
这一流程是文件处理阶段
获取变量
获取变量是该作业的第一个步骤,目的是将上一个阶段获取的参数设置成变量,使得创建文件夹并分类目录.kjb
作业可以使用变量。
这一步相当于是一个接口的转换器,它接收找到题目序号分类,获取路径.ktr
传递过来的文件路径结果,将其设置为变量。
可以理解成一个函数,它接收另一个函数的返回值,将返回值设置成全局变量,使得调用它的kjb
作业也可以使用这些变量。
双击设置变量
,可以查看变量的设置。
注意:这里的字段需要和找到题目序号分类,获取路径
中复制记录到结果
步骤的输出字段(如下图所示)相对应。
文件处理
使用${variable}
的方式对一个变量进行引用。
在复制文件中,kettle会自动创建不存在的目录,因此可以不需要针对目录进行单独处理。
核心分析
整个过程中,比较关键的是文件的分类
和文件处理
。但花的时间最长的地方在设置执行每一个输入行
。
文件的分类需要通过一些数据库的操作和js脚本等流程进行,根据需求的不同有不同的实现。
文件处理
对可以封装的内容进行的思考和探讨
整个流程可以作为文件分类-文件处理的模板/示例。
流程中的核心有两个:文件分类
和文件处理
。
- 文件分类需要针对特定的形式进行定制,可重用性不高。
- 文件处理步骤主要完成的是文件的复制,可以对其进行封装,在多个场景下复用。由于testcase的输入输出文件是成对存在的,因此在流程中将其放到一起。在实际应用中,成对出现文件的情况不太具有普适性。应该将其封装成一个单文件处理的形式。在
获取变量
的设置变量
步骤中,将源路径src_file
和目标路径dest_file
抽象出来,完成单文件的处理。
对文件复制步骤完成的封装如下:
如果源文件不存在时不需要进行操作,单击与创建文件
相连的连接线,使其变为灰色,再将中间的灰色连接线单击点亮即可。
Kettle对非结构化数据进行分类相关推荐
- tensorflow综合示例3:对结构化数据进行分类:csv keras feature_column
文章目录 1.数据集 1.1 使用 Pandas 从csv创建一个 dataframe 1.2 将 dataframe 拆分为训练.验证和测试集 1.3 用 tf.data 创建输入流水线Datase ...
- 非结构化数据定义、处理方法及重要性
一.非结构化数据定义 不方便用数据库二维逻辑表来表现的数据即称为非结构化数据,包括所有格式的办公文档. 文本.图片. 标准通用标记语言下的子集 XML. HTML.各类报表.图像和音频/视频信息等等. ...
- 分析非结构化数据的10个步骤
如今,数据分析正在成为企业发展的重要组成部分.企业必须对结构化和非结构化数据有所了解,才能更好地为业务发展做出正确决策.以下是帮助企业分析非结构化数据的10个步骤: 0 1 确定一个数据源 了解有利于 ...
- 夺权!非结构化数据制霸大数据
结构化 数据与非结构化数据之争已经见到了眉目,而我国的 大数据 产业也正处在由结构化为主到非结构化为主的过程中.那么非结构化数据为何可以取代结构化数据制霸大数据市场呢? 一朝天子一朝臣,一个时代一尊神 ...
- 独家 | 使用机器学习对非结构化数据加速查询-第2部分(具有统计保证的近似选择查询)...
作者:Daniel Kang, Edward Gan, Peter Bailis, Tatsunori Hashimoto, and Matei Zaharia 翻译:殷之涵 校对:方星轩 本文约28 ...
- 独家 | 使用机器学习加速对非结构化数据的查询-第1部分(使用BlazeIt加速聚合和限制查询)...
作者:Daniel Daniel,Peter Bailis和Matei Zaharia 翻译:Kay 校对:王雨桐 本文约2800字,建议阅读13分钟. 本文为大家介绍了针对非结构化数据如何加快聚合和 ...
- 福利 |《非结构化数据分析》书评:探索非结构化数据的魅力
文末有数据派独家福利哦 在过去的几年里,围绕大数据.物联网和人工智能等信息的宣传铺天盖地.这些新闻源源不断地向我们展示了技术和分析工作如何改变我们的生活和商业模式.将大数据和物联网转化为有实际价值的信 ...
- 2015第27周一非结构化数据
非结构化数据包括以下几个类型: 文本:在掌握了元数据结构时,机器生成的数据,如传感器等就一定能够进行解译.当然,流数据中有一些字段需要更加高级的分析和发掘功能. 交互数据:这里指的是社交网络中的数据, ...
- 结构化数据和非结构化数据的区别_中国天辰携手爱数AnyShare,共同探索非结构化数据治理...
近日,天辰公司智能数据中台-内容管理平台项目上线会圆满举行.基于爱数 AnyShare Family搭建的天辰内容管理平台,将帮助天辰统一管理并处理.分析非结构化数据,让数据赋能业务,进行数字资产管理 ...
最新文章
- 7行Python代码,搭建可以识花的机器学习App|视频教程
- token验证_java基于token的身份验证?读完之后,大部分程序员收藏了...
- IP Messenger程序
- Web前端技术趋势:HTML5仍不宜用作生产
- hdu 2019 数列有序!(c语言)
- Octopus系列之更新历史记录
- Go语言的异常处理之errors,panic, recover
- mysql如何实现递归查询
- 学生签到系统c代码_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...
- 姓氏头像制作小程序源码_全新UI带头像库_支持多流量主模式
- python 移动文件 使用os.rename
- PHP如何获取当前域名
- 均匀分布的期望和方差
- oracle用nas还是本地存储,为什么大家都在用NAS网络存储?
- bzoj4816 [Sdoi2017]数字表格(反演)
- 3dmax su 简单_【建模技巧】如何用3DMAX制作简单的绣球模型
- CAD怎么快速查看图纸?如何打开dwg图纸进行查看呢?
- 三级数据库知识点学习(五)
- c++中的 templateclass Type
- symfony简单的博客练习,熟悉具体开发流程
热门文章
- 基于Unity的VR迷宫游戏项目技术分享
- Codeforces 446C. DZY Loves Fibonacci Numbers (Fibonacci + 线段树)
- RabbitMQ--基础--04--运转流程
- 苹果8参数_iPhone11 iPhone11Pro哪里买最便宜靠谱划算 2020双十一苹果手机购机攻略...
- 计算机启动修复怎么还原,电脑开机出现系统恢复选项该怎么办
- c/c++ 求解数独
- android11.0 12.0Launcher3禁止拖拽app图标到第一屏
- 事件研究法与其应用(2)---Excel实操步骤
- 分分钟在自己电脑上建一个视频网站,收费电影随便看,还没广告!
- 极米投影、坚果投影、当贝投影,三大品牌对比来了