精华内容
下载资源
问答
  • 常见版本管理工具

    万次阅读 2017-09-19 22:22:05
    Windows平台下使用VSS开发的典型环境是基于C/S架构的,即开发小组的每个开发者在各自的Windows平台下利用开发工具(比如VC)开发项目中的各个模块,而配专门的服务器集中控制开发过程中的文档和代码。服务器和开发...

    http://blog.csdn.net/zhourui1982/article/details/4871896
    http://wenku.baidu.com/view/054ae81afad6195f312ba6c6.html


    一、VSS

    VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。

    Windows平台下使用VSS开发的典型环境是基于C/S架构的,即开发小组的每个开发者在各自的Windows平台下利用开发工具(比如VC)开发项目中的各个模块,而配有专门的服务器集中控制开发过程中的文档和代码。服务器和开发人员的客户机分别装有VSS的服务器和客户端程序。

    VSS是微软的产品,是配置管理的一种很好的入门级的工具。VSS最初的名字叫Source Safe,是一家小公司的产品,92年曾经获了最佳小型管理工具奖,然后立即被微软收购。但是微软收购的只是source safe的Windows版本,在美国还有另外两家公司分别获得了继续开发和销售source safe的Mac版本和Unix版本的许可,在MS买进vss之后,基本上没有对vss进行任何的研发,MS内部自身也不用vss。

    VSS 没有采用对许可证进行收费的方式,只要安装了 VSS ,对用户的数目是没有限制的。因此使用 VSS 的费用是较低的。它属于“买大件送小件”的角色。如果你合法地得到Visual Studio,你就得到了免费的SourceSafe。

    注:VSS只有Windows环境。


    二、CVS

    CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。CVS版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码的维护。

    2009年,绝大多数CVS服务已经改用SVN。CVS已经停止维护。


    三、SVN

    SVN是一个安全虚拟网络系统,它将系统整体的信息安全功能均衡合理地分布在不同的子系统中,使各子系统的功能得到最大限度的发挥,子系统之间互相补充,系统整体性能大于各子系统功能之和,用均衡互补的原则解决了"木桶原理"的问题。
    SVN能在跨接Internet, Intranet, Extranet间的网络所有端点实现全面的安全,而且还能提供基于企业策略的信息管理机制以充分有效地利用有限的带宽。SVN可以满足各种企业VPN的要求,通过为公司内部网络、远程和移动用户、分支机构和合作伙伴提供基于Internet的安全连接。所以,我们可以将SVN看成是VPN、防火墙、基于企业策略的信息管理软件集成在一起的Internet安全的综合解决方案。在这样一个网络系统中,所有互联网服务器端和客户端都是安全的,并有一个信息管理机制以不断地通过这个外部网络环境动态地分析及满足客户的特定带宽需求。

    注:SVN客户端有Windows环境和linux环境。


    四、GIT

    Git --- The stupid content tracker, 傻瓜内容跟踪器。Linux 是这样给我们介绍 Git 的。
    Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。


    1. git命令行:

    [python]  view plain  copy
    1. usage: git [--version] [--help] [-c name=value]  
    2.            [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]  
    3.            [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]  
    4.            [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]  
    5.            <command> [<args>]  
    6.   
    7. 简单而言,用法: git <command> [command参数]  
    8. command参数可以使用该命令查看: git help <command>  
    9.   
    10. 最常用command如下:  
    11.    add        不但是用来添加不在版本控制中的新文件,也用于添加已在版本控制中但是刚修改过的文件; 在这两种情况下, Git都会获得当前文件的快照并且把内容暂存(stage)到索引中,为下一次commit做好准备。  
    12.                   git add <fileName>  增加文件/目录到当前分支;  
    13.    bisect     Find by binary search the change that introduced a bug  
    14.    branch     显示、新建或者删除一个分支;  
    15.                   git branch  不加参数会得到当前仓库中存在的所有分支列表,星号(“*”)标识了你当工作在哪个分支下。  
    16.                   git branch <branchName>  新建一个分支  
    17.    checkout   CheckOut一个分支并切换到该分支,从而改变了当前分支为此分支   
    18.                   git checkout <branchName> 切换到该分支  
    19.                   git checkout .  放弃本地所有已经编辑,但未commit/push的更改,还原为和远端一样的版本  
    20.    clone      下载一个远端仓库到本地  
    21.                   git clone 'http(s)://[userName@]host:port/xxx/yyy/zzz.git' [dir] 使用http(s)方式从远端仓库进行clone,默认clone到本地的zzz目录,添加dir参数后则clone到dir目录内。如果添加用户名,会提示输入密码,否则使用无验证方式进行clone  
    22.                   git clone 'git@gitRepository:xxx/yyy/zzz.git' [dir] 使用ssh方式从远端仓库进行clone,该方式支持大文件的push和pull,需要先配置密钥,后面进行详述。  
    23.    commit     提交变更到本地仓库;  
    24.                   git commit -a -m '<comment>' -m参数指定注释,-a参数自动添加所有并更到本次的commit中  
    25.    diff       不加参数,显示未提交的本地更改内容;  
    26.               加一个分支名作为参数,则将本地分支和参数指定的分支进行diff;  
    27.               加2个分支名作为参数,则对这两个分支进行diff(注:这2个分支必须已经co到本地);  
    28.               加参数--stat则只给出统计信息  
    29.    fetch      从远端仓库更新当前分支   
    30.    grep       Print lines matching a pattern init Create an empty Git repository or reinitialize an existing one  
    31.    log        倒序展示commit日志  
    32.                   git log [--stat] 倒序展示所有的commit日志,--stat参数会显示变更的内容统计  
    33.    merge      将一个分支merge到当前分支  
    34.                   git merge [branchName] 将该分支合并到当前分支  
    35.    mv         在当前分支中移动文件/目录  
    36.    pull       从远端仓库更新当前分支并智能合并  
    37.    push       提交本地的所有commit到远端仓库  
    38.    rebase     Forward-port local commits to the updated upstream head  
    39.    revert     撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交  
    40.                   git revert HEAD 撤销最近一次的commit  
    41.    reset      Reset current HEAD to the specified state  
    42.    rm         在当前分支中删除文件/目录  
    43.    show       Show various types of objects  
    44.    status     展示当前分支的状态(是否commit,是否push)  
    45.    tag        Create, list, delete or verify a tag object signed with GPG  
    46.    remote     展示当前git目录对应的远端的情况,加-v展示详细信息,例如远端的git路径  
    47.                   git remote set-url origin <git root url>   将git root设定为其他地址  

    2. git设置

    1) 为git设置缩写命令

    修改.gitconfig文件,linux下该文件位于~/.gitconfig,在文件的末尾添加如下代码:

    [python]  view plain  copy
    1. [alias]  
    2.     co = checkout  
    3.     ci = commit  
    4.     st = status  
    5.     pl = pull  
    6.     ps = push  
    7.     dt = difftool  
    8.     l = log --stat  
    9.     cp = cherry-pick  
    10.     ca = commit -a  
    11.     b = branch  
    12.     r = remote -v  

    2)为git设置提交时的用户名和邮件

    执行以下命令:

    [python]  view plain  copy
    1. git config --global user.name "Your Name"  
    2. git config --global user.email you@example.com  
    3. # 或者直接修改gitconfig文件里的name和email配置项  

    3. 上传文件过大的问题的解决办法:

    错误提示:

    error: RPC failed; result=22, HTTP code = 411

    解决办法:

    git config --global http.postBuffer 52428800  (改为最大50M)


    错误提示:

    error: RPC failed; result=22, HTTP code = 413

    该错误是因为web server不支持这么大的文件传输,可以修改ng的配置使web server来支持。或者将http方式改用ssh方式。

    改用ssh方式的具体做法如下:

    1. 设置远程仓库地址

    [python]  view plain  copy
    1. git remote set-url origin git@gitRepository:xxx/yyy/zzz.git  
    2. 客户端产生密钥

    [python]  view plain  copy
    1. ssh-keygen -t rsa -C "userName@xxx.com"  
    然后按3次回车来生成对应的邮箱的密钥
    3. 登录gitlab管理界面,在用户的profile中add public key(上一步生成的public key位于~/.ssh/id_rsa.pub中)


    使用以上方法后clone,push和pull等都不再需要密码。


    4. 常见的.gitignore设置

    [python]  view plain  copy
    1. # kdiff3 ignore  
    2. *.orig  
    3.   
    4. # maven ignore  
    5. target/  
    6.   
    7. # eclipse ignore  
    8. .settings/  
    9. .project  
    10. .classpath  
    11.   
    12. # idea ignore  
    13. .idea/  
    14. *.ipr  
    15. *.iml  
    16. *.iws  
    17.   
    18. # temp ignore  
    19. *.log  
    20. *.cache  
    21. *.diff  
    22. *.patch  
    23. *.tmp  
    24.   
    25. # system ignore  
    26. .DS_Store  
    27. Thumbs.db  
    28.   
    29. # package ignore (optional)  
    30. # *.jar  
    31. # *.war  
    32. # *.zip  
    33. # *.tar  
    34. # *.tar.gz  


    附录一、linux下的SVN使用的简单流程

    1. 第一次把服务器代码下载到本地。

    svn co svn_url [path] 

    #path可以省略,设svn_url=https://xxx/mytool,如果省略path,则在当前目录新建mytool文件夹,并下载svn_url目录里的文件下载到其中;如果path=mytool_local,就在当前目录新建mytool_local,并将svn_url目录里的文件下载到其中。

    2. 更新本地代码

    svn up

    3. 把本地新修改添加的代码更新到服务器

    a) svn st #显示状态

    b) 对于显示的列表里,前面带有?的表示还没有添加到待同步列表里,使用如下命令加入到待同步列表:

    svn add {文件名或目录名} #当添加一个目录,svn add缺省的行为方式是递归。path参数可以使用类似/home/root/svnroot/*/*形式

    svn add * --force #命令svn add *会忽略所有已经在版本控制之下的目录,可以使用参数--force递归到版本化的目录下

    c) 对于显示的列表里,前面带有!的表示本地已经删除,使用如下命令从待同步列表删除(需要先svn up将其副本更新到本地,再执行如下命令):

    svn delete {文件名或目录名}

    d) svn ci -m "comment"  #提交,不带comment会出错

    4. 不co直接将文件添加到svn

    svn import -m 'comment' [path] svn_url

    #path如果省略,则使用当前目录.作为参数

    #如果path为目录,则将path下的内容ci到svn_url的目录下,而不会新建path目录,故一般需要在svn_url中添加目录名。例如:svn import -m 'this is for try' tools http://xxx/bak/tools

    svn co --force svn_url

    #因为import后本地目录并没有被添加到svn控制之下,所以,使用co命令下载到本地,并且要加--force参数来强制执行(因本地已经存在同名目录)

    5. 其他操作

    svn info 需要在已经svn的目录下使用。显示当前目录的svn信息,如url地址,和用户名等。

    svn  rename wc(本地原来目录名/文件名) wc(重命名后的目录名/文件名)

    svn move SRC DST  移动目录或文件夹命令

    6. 切换用户

    1). 临时切换
    在所有命令下强制加上--username 和--password选项。 
    例如:svn up --username zhangsan --password 123456
    2).永久切换
    删除目 ~/.subversion/auth/  下的所有文件。下一次操作svn时会提示你重新输入用户名和密码的。换成你想用的就可以了。然后系统默认会记录下来的。


    附录二、使用主干与分支,解决版本冲突

    1. svn的主干与分支

    trunk--主干,是开发的主线。  
    branches--分支,是从主线上分出来独立于主线的另一条线。
    tags--标记,主要用于项目开发中的里程碑。它往往代表一个可以固定的完整的版本。SVN不推荐在创建的tag基础上Revision这种情况应用branches,因为tag一般保持不变不作任何修改。
    总之,主干和分支都是用来进行开发,而标记是用来进行阶段发布的。branches以及tags在TortoiseSVN中创建方法是一致的:它们都是通过存储类似Linux中的硬连接一样,只是创建了指向某个版本的链接,而不会真正将此版本的内容复制到分支或者标记中,这样既可以节省空间,也可以很快速的创建,被称为“廉价的拷贝”。 

    2. 主干开发,分支发布

    典型操作步骤如下:
    1) 开发者提交所有的新特性到主干。 每日的修改提交到/trunk,包括新特性bug修正和其他。  
    2) 这个主干被拷贝到“待发布”分支。 当小组认为软件已经做好发布的准备如版本1.0然后/trunk会被拷贝到/branches/1.0。  
    3) 项目组继续并行工作测试小组开始对分支进行严酷的测试同时开发小组在/trunk继续新的工作,如准备2.0。如果一个bug在任何一个位置被发现,错误修正需要来回运送。
    4) 分支已经作了标记并且发布。当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标记被打包发布给客户。  
    5) 分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0(分支也在“更新”,但只进行bug修复)。如果积累了足够的bug修正,管理部门决定发布1.0.1版本,拷贝/branches/1.0到/tags/1.0.1,标记被打包发布。 

    优点:
    这种管理方法对已发布产品的维护工作和下一代产品的开发工作进行了隔离。对于已经发布的产品只有维护的补丁发布。而新发行的产品不仅包括了所有的bug修改,还包括了新功能。所以,非常适用于产品线的发布管理。

    缺点:
    1). 必须对主干上的新功能增加进行控制,只能增加下一个发布里面计划集成进去的新特性。
    2). 已经在主干上集成的新特性中的任何一个,如果达不到里程碑的要求,稳定分支就不能创建,就会影响下一个发布的计划。
    3). bug修改必须在各个分支之间合并。

    3. 分支开发,主干发布

    策略介绍:
    与上一种分支策略(它的主干上永远是最新特性的不稳定版本)正好相反,此策略的主干上永远是稳定版本,可以随时发布。
    bug的修改和新功能的增加,全部在分支上进行。而且每个bug和新功能都有不同的开发分支,完全分离。分支上的开发和测试完毕以后才合并到主干。
    而对主干上的每一次发布都做一个标记而不是分支。

    优点:
    1). 每次发布的内容调整起来比较容易。如果某个新功能或者bug在下一次发布之前无法完成,就不可能合并到主干,也就不会影响其他变更的发布。
    2). 每个分支的生命期比较短,唯一长期存在的就是主干,这样每次合并的风险很小。

    缺点:
    1). 分支开发周期不能过长,如果分支长期没有合并到主干上,很可能在最后合并的时候出现严重冲突。
    2). 测试分支就是各个开发分支,而主干上的程序是没有经过测试的。(从这个发布模式上看,最后一个合并入主干的开发分支应该和主干下一次的发布内容相同,但是这个分支的测试却只是本分支的修改内容点,而非产品级别的功能回归,故称:主干上的程序是没有经过测试的)

    4. 分支开发,主干发布--改进:拉分支发布

    就是在发布时不是打tag进行发布,而是拉一个分支出来,测试后进行发布。

    特点:
    当前发布需要回滚时,可以直接将上一个发布分支覆盖到主干。并且,拉分支发布时可以测试主干上的程序,进行成品级别功能回归。

    展开全文
  • 常见的机器视觉工具

    千次阅读 2013-11-13 20:54:48
    机器视觉我们最常用的软件是OpenCV(Intel OpenSource Computer Vision Library),它的中文论坛http://www.opencv.org.cn/index.php里面非常清楚的介绍。 二、VisionPro®7.0系统,快速开发强大的应用系统 ...

    一、开源的OpenCV

    机器视觉我们最常用的软件是OpenCVIntel OpenSource Computer Vision Library),它的中文论坛http://www.opencv.org.cn/index.php里面有非常清楚的介绍。

    二、VisionPro®7.0系统,快速开发强大的应用系统

    康耐视公司(Cognex ®)推出的 VisionPro ® 系统组合了世界一流的机器视觉技术,具有快速而强大的应用系统开发能力。 VisionPro QuickStart ™ 利用拖放工具,以加速应用原型的开发。这一成果在应用开发的整个周期内都可应用。通过使用基于 COM/ActiveX  VisionPro 机器视觉工具和 Visual Basic ®  Visual C++ ® 等图形化编程环境,开发应用系统。与 MVS-8100 ™ 系列图像采集卡相配合, VisionPro 使得制造商、系统集成商、工程师可以快速开发和配置出强大的机器视觉应用系统。

    快速建立原型和易于集成 
    VisionPro 
    的两层软件结构便于建立原型和集成。交互层利用拖放工具和 ActiveX 控件以加速应用系统的开发;在程序层,将原型应用开发成用户解决方案。基于 COM/ActiveX 技术使 VisionPro 应用系统易于集成第三方实用程序(例如图形函数),而且为整个机器(例如 I/O 、机器人控制、工厂通信)提供了基于 COM 控件应用的易于集成性。

    先进的机器视觉软件 
    Cognex 
    的视觉工具库提供了用于测量、检测、制导和识别的视觉软件程序组。即使是在最具挑战性的视觉应用中,这些工具也被证实具有高可靠性。

    硬件灵活性 
    VisionPro 
     用户可在较大范围内选择 MVS-8100 系列图像采集卡,以开发视觉应用。经 VisionPro 软件测试和证明,这些图像采集卡为主机提供了用于图像处理和显示的高速图像转移,以获得快速的视觉应用操作。多相机输入、高速度及对高分辨率相机的支持提高了 VisionPro 系统的采集灵活性。

    技术优势 
    • 
    快速开发强大的基于 PC 的视觉应用

    • 简化视觉系统与其他主控制程序的融合处理

    • 兼容多种 Cognex MVS-8100 系列图像采集卡

    • 通过 QuickStart 拖放工具加速原型应用

    • 配合视觉工具库,以获得高性能

    VisionPro 的软件结构 
    VisionPro 
    提供了易于应用的原型、发展和应用。在交互层,通过系列拖放工具, VisionProQuickStart 原型环境加速了强大机器视觉系统的开发速度。用户可以很快定义工具、测试工具行为及有效的运行参数之间的连接。通过 QuickStart  Visual Basic 可访问 ActiveX 控件。因此,在程序层,原型应用可通过 Visual Basic  Visual C++ 增强,以开发出个性化的解决方案。这一性能将使应用系统的开发时间大大缩短。 VisionPro 的结构使用户可从 QuickStart  ActiveX  COM 对象中的任何一层开始他们的应用系统开发。

       康耐视公司宣布推出 VisionPro®7.0 机器视觉软件。VisionPro 7.0引入了可简化检测应用的开发和现场维修的新概念 InspectionDesigner™VisionPro 7.0还增加了专为全方位和较难读取的一维条码而优化的行业最佳的条码读取工具 1DMax™,以及多个新工具和读取功能增强。

         Inspection Designer 
    的引入 — 首次用于一般检测应用 — 为视觉系统集成商和最终用户提供了可简化检测应用的规范、开发和维修的功能。Inspection Designer 具有三个主要优势:

         ♦
    缺陷的界定。一种新的图像等级评定实用工具,使集成商和最终用户能够轻松地评定产品图像等级和指定各个图像中的不同缺陷类型。图像等级评定实用工具可创建一个已评定等级的图像库,以便在接下来的步骤中使用。

         ♦
    验证。验证工具可帮助开发商快速确认视觉系统正在通过比较数百张,甚至数千张已保存且已评定等级的图像的检测结果等级来获取所需结果。

         ♦
    现场维修。验证工具还允许最终用户对照已评定等级的图像库随时重新测试检验工具,以确认工厂车间调整不会影响之前的检测应用。它还允许用户在已评定等级的工件库中添加新图像。

         “Inspection Designer 
    的引入为系统集成商及其最终用户提供了一种共同的交流工具,因为它规定了定义好、坏工件的正规标准,视觉软件业务部门经理 Markku Jaaskelainen 说道,它可以方便地定义一个项目,并帮助确保集成商和最终用户在项目开始阶段就达成共识。

         VisionPro 7.0 
    还具有多种新功能和增强功能,包括:

         ♦用于处理全方位和较难读取的条码的软件工具 1DMax。1DMax 可以读取其他软件无法读取的条码,包括有镜面反射、损坏、背景噪声和/或旋转的代码。

         ♦支持在 Microsoft® Windows® 7 64 位操作系统中使用 MVS-8602e CameraLink® 板卡,可快速读取需要较大内存的大图像。

         新的 VisionPro 7.0 现已上市。更多信息或要下载 VisionPro 7.0 免费 32 或 64 位试用版,敬请访问http://www.cognex.com/visionpro

    关于康耐视(COGNEX

      康耐视公司设计、研发、生产和销售机器视觉和工业 ID 系统,即有“视觉”的电脑。康耐视的视觉和 ID 系统在全球范围内的整个生产和分销过程中的多种检验、识别和引导应用中被广泛使用。作为全球领先的机器视觉和工业 ID 公司,康耐视自从 1981 年成立以来,已经销售了 50 多万套机器视觉系统,累计利润超过 25 亿美元。康耐视总部设在美国马萨诸塞州 Natick 镇,在北美、日本、欧洲、亚洲和拉丁美洲设有地区办事处和经销处。更多详情,请登录公司网站:http://www.cognex.com

    三、LabVIEW用于机器视觉

    美国NI公司的应用软件LabVIEW机器视觉软件编程速度是最快的。LabVIEW是基于程序代码的一种图形化编程语言。其提供了大量的图像预处理、图像分割、图像理解函数库和开发工具,用户只要在流程图中用图标连接器将所需要的子VIVirtualInstruments LabVIEW开发程序)连接起来就可以完成目标任务。任何1VI都有3部分组成:可交互的用户界面、流程图和图标连接器。LabVIEW编程简单,而且对工件的正确识别率很高。

    四、德国的MVTecHALCON

    HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境。它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的Machine Vision软件。

     

    HALCON源自学术界,它有别于市面一般的商用软件包。事实上,这是一套imageprocessing library,由一千多个各自独立的函数,以及底层的数据管理核心构成。其中包含了各类滤波,色彩以及几何,数学转换,型态学计算分析,校正,分类辨识,形状搜寻等等基本的几何以及影像计算功能,由于这些功能大多并非针对特定工作设计的,因此只要用得到图像处理的地方,就可以用HALCON强大的计算 分析能力来完成工作。应用范围几乎没有限制,涵盖医学,遥感探测,监控,到工业上的各类自动化检测。

     

    HALCON支持WindowsLinuxMac OS X操作环境,它保证了投资的有效性。整个函数库可以用CC++C#Visual basicDelphi等多种普通编程语言访问。HALCON为大量的图像获取设备提供接口,保证了硬件的独立性。它为百余种工业相机和图像采集卡提供接口,包括GenlCamGigEIIDC 1394

    HALCON功能

    随着MVTec公司与学术界的不断合作,在最新推出的HALCON 11中具有以下新功能:

    1.技术革新

    HALCON 11可以实现真正意义上的目标识别。基于样本的识别方法可以区分出数量巨大的目标对象。使用这种技术可以实现仅依靠颜色或纹理等特征即可识别经过训练的目标,从而无需再采用一维码或二维码等用于目标识别的特殊印记。

    2.强大的三维视觉处理

    HALCON 11提供的一个极为突出的新技术是三维表面比较,即将一个三维物体的表面形状测量结果与预期形状进行比较。HALCON提供的所有三维技术,如多目立体视觉或sheet of light,都可用于表面重构;同时也支持直接通过现成的三维硬件扫描仪进行三维重构。此外,针对表面检测中的特殊应用对光度立体视觉方法进行了改善。不仅如此,HALCON现在还支持许多三维目标处理的方法,如点云的计算和三角测量、形状和体积等特征计算、通过切面进行点云分割等。

    3.高速机器视觉体验

    自动算子并行处理 (AOP) 技术是HALCON的一个独特性能。HALCON 11中支持使用GPU处理进行机器视觉算法的算子超过75个,比其他任何软件开发包提供的数量都多。除此之外,基于聚焦变化的深度图像获取 (depth fromfocus)、快速傅立叶变换 (FFT) HALCON的局部变形匹配都有显著的加速。HALCON 11会带给用户更高速的机器视觉体验。

     

    4.其他新功能

    1Aztec码识别;

    2Micro QR码识别;

    3)为分类自动选择特征;

    4)使用HDevelop性能评测工具进行高效的编码分析;

    5)支持Mac OS X 10.7操作系统;

    6)重新修订HALCON/C++接口;

    7)三维数据快速可视化;

    8)远心镜头立体视觉;

    9)改善摄像机标定技术;

    10HDevelop OCR助手,包含训练文件浏览器;

    11)用于一维码和二维码识别的GS1术语学;

    12)串行化HALCON/.NETHALCON/C++

    13)易用的测量工具;

    14)支持JPEG XR及其他。

     

     

    五、MATLAB相关的工具箱

    如下:

    Image Processing Toolbox (图像处理工具箱)
    Computer Vision System Toolbox 
    (计算机视觉工具箱)
    Image Acquisition Toolbox 
    (图像采集工具箱)

     

     

    其他的一些工具箱


    1
    。名称:机器视觉工具箱。(Machine Vision Toolbox 
    2
    。开发者:Peter Corke. 发布日期: 1999 
    3
    。机构:澳大利亚 布里斯班 机器人和自动化研究组 负责人。
    4
    。下载界面:
    http://www.cat.csiro.au/cmst/staff/pic/vision-tb.html
    5
    。简介:这个工具箱是作者研究领域的程序收集:光度测定、
    图像测量、比色、过滤、特征提取、图像读写、过滤、分割等。结合Matlab和工作站,可以作为机器视觉算法研究提供方便的支持。

    B
    1
    。名称:听觉工具箱。(Auditory Toolbox
    2
    。开发者:Malcolm Slaney. 发布日期: 1998 
    3
    。机构:加拿大 Interval Research 公司。
    4
    。下载界面:
    http://rvl4.ecn.purdue.edu/~malcolm/interval/1998-010/
    5
    。简介:听觉工具箱可以实现典型的听觉模型,它还可以帮助您验证您的听觉模型假说,揭示人类听觉系统感知声音的原理。

    C
    1
    。名称:人类循环系统模型工具箱 PHYSBEa physiological simulation benchmark experiment
    2
    。开发者:Kevin Kohrt。发布日期: 1966年提出理论模型,1999年提供下载。
    3
    。机构:____
    4
    。下载界面:
    http://www.mathworks.com/products/demos/simulink/physbe/
    5
    。简介:经典的人类循环系统仿真模型,可以用来模拟血流中的氧、氮、营养物质、热量和化学示踪剂。

    D
    1
    。名称:代谢模型 分析与优化工具箱 MetMAP is a Matlab Toolboxfor Metabolical Modeling, Analysis and oPtimization 
    2
    。开发者:Julio Vera。发布日期: 2003年。
    3
    。机构:西班牙 La Laguna大学。
    4
    。下载界面:http://webpages.ull.es/users/sympbst/pag_ing/pag_metmap/index.htm
    http://webpages.ull.es/users/sympbst/pag_ing/pag_metmap/Downloads.htm
    5
    。简介:帮助您从理论模型的角度来研究一个代谢系统,分析代谢通路的结构和动力学性质。另外,可以对一个干预措施进行优化设计。

    E
    1
    。名称:大脑风暴 (脑电磁信号可视化与分析工具箱 BrainStorm is an integrated Matlab Toolbox dedicated toMagnetoencephalography (MEG) and Electroencephalography (EEG) datavisualization and processing. 
    2
    。开发者: Felix Darvas。更新日期: 20051月!
    3
    。机构:USC, Los Angeles 
    4
    。下载界面:http://neuroimage.usc.edu/brainstorm/Downloads.php
    请用我的账号登陆。用户名: tenhospital@hotmail.com 密码:UsPQ7t5G
    5
    。简介:能够对脑电图、脑磁波描记图进行可视化和分析。是这方面非常重要的共享件。

    F
    1
    。名称:脑电图实验室 (脑电磁生理信号分析工具箱 EEGLAB (v4.x) is an interactive Matlab toolbox for processingcontinuous and event-related EEG, MEG and other electrophysiological data usingindependent component analysis (ICA), time/frequency analysis, and othermethods including artifact rejection. 
    2
    。开发者: A Delorme 。更新日期: 2004年。
    3
    。机构: Computational Neurobiology Laboratory, The Salk Institute.
    4
    。下载界面:http://sccn.ucsd.edu/eeglab/
    5
    。简介:能够对脑电图、脑磁波描记图进行可视化和分析。

    G
    1
    。名称:超声射束形成工具箱 Beamformation Toolbox
    2
    。开发者: Svetoslav Nikolov。更新日期: 20001月。
    3
    。机构: Electronics & Signal Processing TechnicalUniversity of Denmark.
    4
    。下载界面:http://www.oersted.dtu.dk/personal/sn/ultrasound_imaging/?BFT/main.html
    5
    。简介:由C写成,运行速度快。具有多种算法。This is a toolbox for Matlab written in C for beamformation ofultrasound data. It is extremely fast and supports all of the standardbeamformation methods as well as monostatic, bistatic and polystatic syntheticaperture focusing. The beamformation can be either line, all lines in parallel.. 

    H
    1
    。名称:细胞生长结构可视化工具箱 Growing Cell Structure Visualisation Toolbox
    2
    。开发者: Rob Harrison 。发表日期:1999 年。
    3
    。机构: Departments of Automatic Control & Systems Engineeringand Pathology University of Sheffield
    4
    。下载界面:http://www.shef.ac.uk/~path/GCSVIS/index.html
    5
    。简介:发表于Lancet杂志的相应软件。使用前需要对其方法有所了解。Walker AJ, Cross SS, Harrison RF. Visualisation ofbiomedical datasets by use of growing cell structure networks: a noveldiagnostic classification technique. Lancet 1999; 354:1518-1521.

    六、加拿大的Maxtor Image library

    MIL软件包是一种硬件独立、有标准组件的32位图象库。它有一整套指令,针对图象的处理和特殊操作,包括:斑痕分析、图象校准、口径测定、二维数据读写、测量、图案识别及光学符号识别操作。它也支持基本图形设备。MIL能够处理二值,灰度或彩色图象。

    此软件包为应用的快速发展设计,便于使用。它有完全透明的管理系统,沿袭虚拟数据对象操作,而非物理数据对象操作,允许独立于平台的应用。这意味着一个MIL应用程序能够在不同环境(Win98/Me/NT/2000)中运行于任何VESA-compatible VGA板或Matrox图象板上。MIL用用系统的观念识别硬件板,单一应用程序可控制一种以上硬件板。MIL能单独在主机上运行,但使用专用加速Matrox硬件效率更高。

    MIL软件包具有以下功能:
    · 
    获取高达16位的灰度图或彩色图
    · 
    处理181632位整数或浮点数图象
    · 
    根据操作处理彩色图象彩色图象的每一层会被相继的独立处理。统计分析、斑痕分析、测量、图案匹配、光学符号识别和代码操作不支持彩色处理。
    · 
    显示1816位灰度或彩色图象(平台支持情况下)


    MIL
    函数功能:
    ·点对点
    ·统计
    ·滤波
    ·形态学处理
    ·几何变换
    ·粒子分析
    ·测量
    ·压缩/解压缩
    ·边缘查找
    ·几何模型查找
    ·模式匹配
    ·条码和矩阵码
    ·校准
    ·光学字符识别OCR
    ·相机自动聚焦
    ·应用程序控制
    ·数据控制
    ·显示控制
    ·数字设备控制
    ·图形

     七、eVision机器视觉软件

    eVision机器视觉软件包是由比利时euresys公司推出的一套机器视觉软件开发SDK,相比于其他的机器视觉开发包例如cognex visionlibrary, Matrox Imaging library,它似乎在SDK的功能分类上比这两个提供了更多的选择项,而这一点感觉Matrox Imaginglibrary做特别差,显得特别苍白。

        evision机器视觉软件开发包所有代码都经过mmx指令的优化,处理速度非常快,感觉和IntelIPP有的一拼(当然还是比IPP稍逊一筹,但是毕竟这是Intel自家开发的),但却提供了比IPP多得多的机器视觉功能,例如OCROCV,基于图像比对的图像质量检测,BarcodeMatrixCode识别。而且我在这两年开发机器视觉软件基本都是基于evision开发,

     

      evision主要以下几个模块组成:

      Easy - 通用库,包含数据结构的定义以及图像文件的存储和读取等。

      EasyImage - 数字图像处理通用库,包含通用的数字图像处理操作和算法,比如fft,图像的代数运   算,直方图统计和分析,图像配准和几何变换等等。

      EasyColor  彩色图像处理库,包括彩色图像空间的转换,Bayer转换,基于K均值的彩色图像分割算法等

      EasyObject  Blob分析库,包括Blob的特征提取,图像分割等。

      EasyGauge  基于亚象素的图像测量工具。

      EasyMatch  基于灰度相关性的图像匹配包,速度非常快,而且能够得到达到亚象素精度的匹配结果。对于旋转,尺度变化和平移等都能精确找到模板图像的位置。

      EasyFind  基于几何形状的图像匹配包,速度也非常快,但是精度不太准确,受图像噪声影响大,euresys公司还在继续完善中。

      EasyOCR  字符识别工具包,做的也不是太好,因为是基于模板匹配的方法,没有基于神经网络的来的精确,但是在大部分场合下还是非常适用的,速度快,定位精度高。

      EasyOCV-印刷质量检测包,做的尤其好,和下面要介绍的EChecker使用,可以广泛适用于印刷检测和字符质量检测等场合,速度和准确度都非常高。

      EChecker 更广范的印刷质量检测包,适用于所有的印刷检测对象。

      EasyBarcodeEasyMatrixCode-一维,二维条码识别库。做的也是相当一流的,和CVL不相上下。

      EasyBGA-半导体芯片的BGA检测包。

      EasyWorldShape  计算机视觉标定工具

     八、HexSight

    Adept公司出品的HexSight是一款高性能的、综合性的视觉软件开发包,它提供了稳定、可靠及准确定位和检测零件的机器视觉底层函数。其功能强大的定位器工具能精确地识别和定位物体,不论其是否旋转或大小比例发生变化。HexSight即使在最恶劣的工作环境下都能提供可靠的检测结果,呈现出非凡的性能。


    HexSight
    软件包含一个完整的底层机器视觉函数库,程序员可用它来建构完整的高性能2D机器视觉系统,节省整个系统开发的时间。HexSight可利用Visual BasicVisual C++Borland Dephi平台方便地进行二次开发。


    HexSight 的历史 
    HexSight最早是一家位于加拿大魁北克专注于机器视觉算法开发的公司, HexSight是世界上第一个做到1/40亚像素精度的视觉软件,其特点是精度高、定位识别速度快、对环境光线等干扰不敏感、检测可靠性极高,因而于20007月被美国著名机器人公司Adept收购。HexSight软件自1999年发布的Release1.0开始,现在已分布Release3.3版本。


    HexSight 的定位技术 
    HexSight的定位工具是根据几何特征,采用最先进的轮廓检测技术来识别对象和模式。这一技术在图像凌乱、亮度波动、图像模糊和对象重叠等方面有显著效果。HexSight能处理自由形状的对象,并具有功能强大的去模糊算法。HexSight快速,在一台2GHz 的处理器上,一般零件寻找和定位不超过10ms,并可达到1/40亚像素位置重复精度和0.01度旋转重复精度。此外HexSight有丰富但易用的图像标定工具,而且它的定位器可以方便嵌入到OEM的产品中。

    九、RVB机器视觉和图象处理算法软件

    利维机器视觉应用软件开发包(Real ViewBench,简称RVB)是致力于自动化领域的专业机器视觉和图象处理算法软件包,是机器视觉行业极具竞争力和价格优势的专业算法软件包。

    RVB包含各种Blob分析,形态学运算,模式识别和定位,尺寸测量等性能杰出的算法,提供不同形状关注区(Region ofInterest, 简称ROI)操作,可以开发强大的视频人机界面功能。RVB提供了稳定、可靠及准确定位和检测零件的机器视觉底层函数,其功能强大的定位器工具能精确地识别和定位物体,即使在最恶劣的工作环境下都能提供可靠的检测结果,呈现出非凡的性能。

    RVB软件包含一个完整的底层机器视觉函数库,程序员可用它来建构完整的高性能2D机器视觉系统,节省整个系统开发的时间。可利用Visual BasicVisual C++Borland Dephi平台方便地进行RVB二次开发。

    RVB与图象采集设备如CCD相机无关,目前支持多种厂家的相机,接口包括USB2.0/3.0 GigE1394a/b,如有更多相机接口要求,可以为客户免费定制。

     

    精华版功能

    ¨         支持8,16,24,32位深度数字图像;支持绝大部分文件图像格式如BMP,JPG,GIF, TIF等。

    ¨         提供各种图象预处理功能,如规范化处理,边缘增强,去噪,形态学运算如腐蚀,膨胀,几何变换如缩放,旋转等;

    ¨         提供各种统计分析功能如面积,方向,椭圆度,投影统计,柱状图分析,定位,模式识别等;

    ¨         提供强大的BLOB分析和相关处理功能,如自动二值化,BLOB属性分析,BLOB与图象的变换;

    ¨         支持多种形状的关注区(ROI)对象处理功能,如矩形,圆形,环行,自定义形状,满足绝大应用系统的需要;

    ¨         提供基于高性能的GUI功能,支持各种几何图形的绘制,数字图象的绘制和RVB各种特定对象的绘制,满足复杂多变的视频交互要求。

     

    下载RVB精华版

     

    专业版功能

    ¨         包含所有精华版的功能;

    ¨         提供各种常用功能的软Caliber类,如定位,BLOB 分析,正反识别,记数等,可以快速应用到具体视觉方案里面,缩小应用系统开发周期;

    ¨         提供专用的支持软Caliber显示和编辑的视频编辑窗口类,支持缩放显示,拉伸等,可以开发灵活的应用界面;

    ¨         支持Caliber类快速进行文件读写操作。

     

     

    RVB在业界范围内广泛得到使用,用户可以利用其开放式结构快速开发图像处理和机器视觉应用软件。下面是部分已经应用RVB的行业:

     

    •宇宙航空和太空旅行

    •汽车零件制造

    •制陶业

    •化学

    •电子元件和设备

    •食品业

    •玻璃制造和生产

    •身体健康和生命科学

    •冶金和勘探业

    •机械

    •医疗和制药业

    •纸制造业

    •精密工程和光学

    •车轨和火车检测

    •橡胶

    •半导体

    •轮船制造


    展开全文
  • 开源ETL工具kettle系列之常见问题

    千次阅读 2013-08-21 13:58:03
    开源ETL工具kettle系列之常见问题 摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案 1. Join 我得到A 数据流(不管是...

    开源ETL工具kettle系列之常见问题

    摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案

    1. Join
    我得到A 数据流(不管是基于文件或数据库),A包含field1 , field2 , field3 字段,然后我还有一个B数据流,B包含field4 , field5 , field6 , 我现在想把它们起来, 应该怎么样做.
    这是新手最容易犯错的一个地方,A数据流跟B数据流能够Join,肯定是它们包含join key ,join key 可以是一个字段也可以是多个字段。如果两个数据流没有join key ,那么它们就是在做笛卡尔积,一般很少会这样。比如你现在需要列出一个员工的姓名和他所在部门的姓名,如果这是在同一个数据库,大家都知道会在一个sql 里面加上where 限定条件,但是如果员工表和部门表在两个不同的数据流里面,尤其是数据源的来源是多个数据库的情况,我们一般是要使用Database Join 操作,然后用两个database table input 来表示输入流,一个输入是部门表的姓名,另一个是员工表的姓名,然后我们认为这两个表就可以 ”Join” 了,我们需要的输出的确是这两个字段,但是这两个字段的输出并不代表只需要这两个字段的输入,它们之间肯定是需要一个约束关系存在的。另外,无论是在做 Join , Merge ,Update , Delete 这些常规操作的时候,都是先需要做一个compare 操作的,这个compare 操作都是针对compare key 的,无论两个表结构是不是一样的,比如employee 表和department 表,它们比较的依据就是employee 的外键department_id , 没有这个compare key 这两个表是不可能连接的起来的.. 对于两个表可能还有人知道是直接sql 来做连接,如果是多个输入数据源,然后是三个表,有人就开始迷茫了,A表一个字段,B表一个字段,C表一个字段,然后就连Join操作都没有,直接 database tableoutput , 然后开始报错,报完错就到处找高手问,他们的数据库原理老师已经在吐血了。如果是三个表连接,一个sql 不能搞定,就需要先两个表两个表的连接,通过两次compare key 连接之后得到你的输出,记住,你的输出并不能代表你的输入. 下面总结一下:
    1. 
    单数据源输入,直接用sql 做连接
    2. 
    多数据源输入,(可能是文本或是两个以上源数据库),用database join 操作.
    3. 
    三个表以上的多字段输出.

    2. Kettle的数据库连接模式
    Kettle
    的数据库连接是一个步骤里面控制一个单数据库连接,所以kettle的连接有数据库连接池,你可以在指定的数据库连接里面指定一开始连接池里面放多少个数据库连接,在创建数据库连接的时候就有Pooling 选项卡,里面可以指定最大连接数和初始连接数,这可以一定程度上提高速度.

    3. transaction
    我想在步骤A执行一个操作(更新或者插入),然后在经过若干个步骤之后,如果我发现某一个条件成立,我就提交所有的操作,如果失败,我就回滚,kettle提供这种事务性的操作吗?
    Kettle
    里面是没有所谓事务的概念的,每个步骤都是自己管理自己的连接的,在这个步骤开始的时候打开数据库连接,在结束的时候关闭数据库连接,一个步骤是肯定不会跨session的(数据库里面的session, 另外,由于kettle是并行执行的,所以不可能把一个数据库连接打开很长时间不放,这样可能会造成锁出现,虽然不一定是死锁,但是对性能还是影响太大了。ETL中的事务对性能影响也很大,所以不应该设计一种依赖与事务方式的ETL执行顺序,毕竟这不是OLTP,因为你可能一次需要提交的数据量是几百 GB都有可能,任何一种数据库维持一个几百GB的回滚段性能都是会不大幅下降的.

    4. 我真的需要transaction 但又不想要一个很复杂的设计,能不能提供一个简单一点的方式
    Kettle
    3.0.2GA版中将推出一种新功能,在一个table output 步骤中有一个Miscellaneous 选项卡,其中有一个Use unique connections 的选项,如果你选中的话就可以得到一个transaction 的简单版,
    由于是使用的单数据库连接,所以可以有错误的时候回滚事务,不过要提醒一点是这种方式是以牺牲非常大的性能为前提条件的,对于太大的数据量是不适合的(个人仍然不建议使用这种方式)

    5. temporary 表如何使用
    我要在ETL过程中创建一个中间表,当某个条件成立的时候,我要把中间表的数据进行转换,当另一条件成立的时候我要对中间表进行另一个操作,我想使用数据库的临时表来操作,应该用什么步骤。
    首先从temp 表的生命周期来分,temp分为事务临时表和会话临时表,前面已经解释过了,kettle是没有所谓事务的概念的,所以自然也没有所谓的事务临时表。Kettle的每个步骤管理自己的数据库连接,连接一结束,kettle也就自然丢掉了这个连接的session handler , 没有办法可以在其他步骤拿回这个session handler , 所以也就不能使用所谓的会话临时表,当你尝试再开一个连接的时候,你可以连上这个临时表,但是你想要的临时表里面的数据都已经是空的(数据不一定被清除了,但是你连不上了),所以不要设计一个需要使用临时表的转换
    之所以会使用临时表,其实跟需要事务特性有一点类似,都是希望在ETL过程中提供一种缓冲。临时表很多时候都不是某一个源表的全部数据的镜像,很多时候临时表都是很小一部分结果集,可能经过了某种计算过程,你需要临时表无非是基于下面三个特性:
    1. 
    表结构固定,用一个固定的表来接受一部分数据。
    2. 
    每次连接的时候里面没有数据。你希望它接受数据,但是不保存,每次都好像执行了truncate table 操作一样
    3. 
    不同的时候连接临时表用同一个名字,你不想使用多个连接的时候用类似与temp1 , temp2 , temp3, temp4 这种名字,应为它们表结构一样。
    既然临时表不能用,应该如何设计ETL过程呢?(可以用某种诡异的操作搞出临时表,不过不建议这样做罢了)
    如果你的ETL过程比较的单线程性,也就是你清楚的知道同一时间只有一个这样的表需要,你可以创建一个普通的表,每次连接的时候都执行truncate 操作,不论是通过table output truncate table 选项,还是通过手工执行truncate table sql 语句(在execute sql script 步骤)都可以达到目的(基于上面的12 特性)
    如果你的ETL操作比较的多线程性,同一时间可能需要多个表结构一样并且里面都是为空的表(基于上面123特性),你可以创建一个字符串+序列”  的模式,每次需要的时候,就创建这样的表,用完之后就删除,因为你自己不一定知道你需要多少个这种类型的表,所以删除会比truncate 好一些。
    下面举个例子怎么创建这种表:
    你可以使用某种约定的表名比如department_temp 作为department 的临时表。或者
    argument 传到表名,使用department_${argument} 的语法,
    如果你需要多个这种表,使用一个sequence 操作+execute sql script 操作,execute sql script 就下面这种模式
              Create table_? (…………..)
    在表的名字上加参数,前面接受一个sequence 或类似的输入操作.
    需要注意的是这种参数表名包括database table input 或者execute sql script ,只要是参数作为表名的情况前面的输入不能是从数据库来的,应为没有办法执行这种preparedStatement 语句,从数据库来的值后面的操作是值操作” ,而不是字符串替换,只有argument 或者sequence 操作当作参数才是字符串替换. (这一点官方FAQ也有提到)

    6. update table execute sql script 里面执行update 的区别
    执行update table 操作是比较慢的,它会一条一条基于compare key 对比数据,然后决定是不是要执行update sql , 如果你知道你要怎么更新数据尽可能的使用execute sql script 操作,在里面手写update sql (注意源数据库和目标数据库在哪),这种多行执行方式(update sql)肯定比单行执行方式(update table 操作)快的多。
    另一个区别是execute sql script 操作是可以接受参数的输入的。它前面可以是一个跟它完全不关的表一个sql :
    select field1, field2 field3 from tableA
    后面执行另一个表的更新操作:
    update tableB set field4 = ? where field5=? And field6=?
           
    然后选中execute sql script execute for each row .注意参数是一一对应的.(field4 对应field1 的值,
    field5
    对应field2 的值, field6 对应field3 的值)

    7. kettle的性能
    kettle
    本身的性能绝对是能够应对大型应用的,一般的基于平均行长150的一条记录,假设源数据库,目标数据库以及kettle都分别在几台机器上(最常见的桌面工作模式,双核,1G内存),速度大概都可以到5000 行每秒左右,如果把硬件提高一些,性能还可以提升 , 但是ETL 过程中难免遇到性能问题,下面一些通用的步骤也许能给你一些帮助.
    尽量使用数据库连接池
    尽量提高批处理的commit size
    尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流)
    Kettle
    Java 做的,尽量用大一点的内存参数启动Kettle.
    可以使用sql 来做的一些操作尽量用sql
    Group , merge , stream lookup ,split field
    这些操作都是比较慢的,想办法避免他们.,能用sql 就用sql
    插入大量数据的时候尽量把索引删掉
    尽量避免使用update , delete 操作,尤其是update , 如果可以把update 变成先delete ,  insert .
    能使用truncate table 的时候,就不要使用delete all row 这种类似sql
    合理的分区
    如果删除操作是基于某一个分区的,就不要使用delete row 这种方式(不管是delete sql 还是delete 步骤),直接把分区drop 掉,再重新创建
    尽量缩小输入的数据集的大小(增量更新也是为了这个目的)
    尽量使用数据库原生的方式装载文本文件(Oracle sqlloader , mysql bulk loader 步骤)
    尽量不要用kettle calculate 计算步骤,能用数据库本身的sql 就用sql ,不能用sql 就尽量想办法用procedure , 实在不行才是calculate 步骤.
    要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变慢,观察kettle log 生成的方式来了解你的ETL操作最慢的地方。
    远程数据库用文件+FTP 的方式来传数据,文件要压缩。(只要不是局域网都可以认为是远程连接)

    8. 描述物理环境
    源数据库的操作系统,硬件环境,是单数据源还是多数据源,数据库怎么分布的,做ETL的那台机器放在哪,操作系统和硬件环境是什么,目标数据仓库的数据库是什么,操作系统,硬件环境,数据库的字符集怎么选,数据传输方式是什么,开发环境,测试环境和实际的生产环境有什么区别,是不是需要一个中间数据库(staging 数据库) ,源数据库的数据库版本号是多少,测试数据库的版本号是多少,真正的目标数据库的版本号是多少……. 这些信息也许很零散,但是都需要一份专门的文档来描述这些信息,无论是你遇到问题需要别人帮助的时候描述问题本身,还是发现测试环境跟目标数据库的版本号不一致,这份专门的文档都能提供一些基本的信息

    9. procedure
    为什么我不能触发procedure?
    这个问题在官方FAQ里面也有提到,触发procedure http client 都需要一个类似与触发器的条件,你可以使用generate row 步骤产生一个空的row ,然后把这条记录连上procedure 步骤,这样就会使这条没有记录的空行触发这个procedure (如果你打算使用无条件的单次触发) ,当然procedure 也可以象table input 里面的步骤那样传参数并且多次执行.
    另外一个建议是不要使用复杂的procedure 来完成本该ETL任务完成的任务,比如创建表,填充数据,创建物化视图等等.

    10. 字符集
    Kettle
    使用Java 通常使用的UTF8 来传输字符集,所以无论你使用何种数据库,任何数据库种类的字符集,kettle 都是支持的,如果你遇到了字符集问题,也许下面这些提示可以帮助你:
    1. 
    单数据库到单数据库是绝对不会出现乱码问题的,不管原数据库和目标数据库是何种种类,何种字符集
    2. 
    多种不同字符集的原数据库到一个目标数据库,你首先需要确定多种源数据库的字符集的最大兼容字符集是什么,如果你不清楚,最好的办法就是使用UTF8来创建数据库.
    3. 
    不要以你工作的环境来判断字符集:现在某一个测试人员手上有一个oracle 的基于xxx 字符集的已经存在的数据库,并且非常不幸的是xxx 字符集不是utf8 类型的,于是他把另一个基于yyy字符集的oracle 数据库要经过某一个ETL过程转换到oracle , 后来他发现无论怎么样设置都会出现乱码,这是因为你的数据库本身的字符集不支持,无论你怎么设置都是没用的. 测试的数据库不代表最后产品运行的数据库,尤其是有时候为了省事把多个不同的项目的不相关的数据库装在同一台机器上,测试的时候又没有分析清楚这种环境,所以也再次强调描述物理环境的重要性.
    4. 
    你所看到的不一定代表实际储存的:mysql 处理字符集的时候是要在jdbc 连接的参数里面加上字符集参数的,而oracle 则是需要服务器端和客户端使用同一种字符集才能正确显示,所以你要明确你所看到的字符集乱码不一定代表真的就是字符集乱码,这需要你检查在转换之前的字符集是否会出现乱码和转换之后是否出现乱码,你的桌面环境可能需要变动一些参数来适应这种变动
    5. 
    不要在一个转换中使用多个字符集做为数据源.

    11. 预定义时间维
    Kettle
    提供了一个小工具帮助我们预填充时间维,这个工具在kettle_home / samples / transformations /General – populate date dimension. 这个示例产生的数据不一定能满足各种需要,不过你可以通过修改这个示例来满足自己的需求.

    12. SQL tab Options tab
    在你创建一个数据库连接的时候除了可以指定你一次需要初始化的连接池参数之外(在 Pooling 选项卡下面),还包括一个Options 选项卡和一个 SQL 选项卡, Options 选项卡里面主要设置一些连接时的参数,比如autocommit on 还是off , defaultFetchSize , useCursorFetch(mysql 默认支持的)oracle 还支持比如defaultExecuteBatch , oracle.jdbc.StreamBufferSize,oracle.jdbc.FreeMemoryOnEnterImplicitCache ,你可以查阅对应数据库所支持的连接参数,另外一个小提示:在创建数据库连接的时候,选择你的数据库类型,然后选到Options 选项卡,下面有一个Show help text on options usage , 点击这个按钮会把你带到对应各个数据库的连接参数的官方的一个参数列表页面,通过查询这个列表页面你就可以知道那种数据库可以使用何种参数了.
    对于SQL 选项卡就是在你一连接这个Connection 之后,Kettle 会立刻执行的sql 语句,个人比较推荐的一个sql 是执行把所有日期格式统一成同一格式的sql ,比如在oracle 里面就是:
       alter session set nls_date_format = xxxxxxxxxxxxx
       alter session set nls_xxxxxxxxx = xxxxxxxxxxxx
    这样可以避免你在转换的时候大量使用to_date() , to_char 函数而仅仅只是为了统一日期格式,对于增量更新的时候尤其适用.

    13. 数据复制
    有的时候可能我们需要的是类似数据复制或者一个备份数据库,这个时候你需要的是一种数据库私有的解决方案,Kettle 也许并不是你的第一选择,比如对于Oracle 来说,可能rman , oracle stream, oracle replication 等等, mysql 也有mysql rmaster / slave模式的replication 等私有的解决方法,如果你确定你的需求不是数据集成这方面的,那么也许kettle 并不是一个很好的首选方案,你应该咨询一下专业的DBA人士也会会更好.

    14. 如何控制版本变更
    Kettle
    的每一个transformation job 都有一个version 字段(在你保存的时候), 不过这个功能还不实用,如果你需要版本控制的话,还是建议你将transformation job 转换成文本文件保存,然后用svn cvs 或任意你熟悉的版本控制系统将其保存,kettle 将在下一个版本加入版本控制的功能(做的更易用).

    15. 支持的数据源
    Kettle
    支持相当广的数据源,比如在数据库里面的一些不太常见的Access , MaxDB (SAP DB) , Hypersonic , SAPR/3 system , Borland Interbase , Oracle RDB , Teradata3.0新加入的Sybase IQ .
    另外还包括Excel , CSV , LDAP ,以及OLAP Server Mondrian, 目前支持Web Service 不过暂时还不支持SOAP.

    16. 调试和测试
    ETL转换出现不可预知的问题时,或是你不清楚某个步骤的功能是什么的情况下,你可能需要创建一个模拟环境来调适程序,下面一些建议可能会有所帮助:
    尽量使用generate row 步骤或者固定的一个文本文件来创建一个模拟的数据源
    模拟的数据源一定要有代表性,数据集一定尽量小(为了性能考虑)但是数据本身要足够分散.
    创建了模拟的数据集后你应该清楚的知道你所要转换之后的数据时什么样的.

    17. 错误处理
    ETL任务中由于数据问题出现转换错误是一件非常正常的事情,你不应该设计一个依赖于临时表或者拥有事务特点的ETL过程,面对数据源质量问题的巨大挑战,错误处理是并不可少的,kettle同样提供非常方便的错误处理方式,在你可能会出错的步骤点击右键选择Define Error handing, 它会要求你指定一个处理error 的步骤,你可以使用文本文件或者数据库的表来储存这些错误信息,这些错误信息会包含一个id 和一个出错的字段,当你得到这些错误信息之后就需要你自己分析出错的原因了,比如违反主键约束可能是你生成主键的方式有错误或者本身的数据有重复,而违反外键约束则可能是你依赖的一些表里面的数据还没有转换或者外键表本身过滤掉了这些数据. 当你调整了这些错误之后,确定所有依赖的数据都被正确的处理了.kettle user guide 里面有更详细的解释,里面还附带了一个使用javascript 来处理错误的示例,这种方式可以作为处理简单数据质量的方式.

    18. 文档,文档,文档
    Kettle
    提供了丰富的文档和使用手册,小到一个数据库连接怎么连,大到一个功能怎么实现,所有的参数列表,对话框的每一个输入输出代表什么意思都有解释,所以当你遇到问题你应该第一时间翻阅这些文档,也许上面已经告诉你怎么做了. 另外kettle 还有一个非常活跃的社区,你可以到上面提问,但是记住在你提问之前先搜索一下论坛看有没有类似的问题已经问过了,如果没有记得描述清楚你的问题

    总结
    本系列文章主要讨论了如何使用kettle 来处理数据仓库中的缓慢增长维,动态ETL如何设计,增量更新的一些设计技巧,在应用程序中如何集成kettle 以及在使用kettle 时的一些常见问题. 如果你正在寻找一个工具来帮助你解决数据库的集成问题或是你打算建立一个商业智能项目的数据仓库,那么kettle是一个不错的选择,你不用支付任何费用就可以得到很多很多数据集成的特性,大量文档和社区支持. 难道这些不就是你希望从一个商业工具上的到的吗?还在等什么,开始你的数据集成之旅吧

    开源ETL工具kettle系列之在应用程序中集成

    摘要:本文主要讨论如何在你自己的Java应用程序中集成Kettle

    如果你需要在自己的Java应用程序中集成Kettle , 一般来说有两种应用需求,一种是通过纯设计器来设计ETL转换任务,然后保存成某种格式,比如xml或者在数据库中都可以,然后自己调用程序解析这个格式,执行这种转换,是比较抽象的一种执行方式,ETL里面转换了什么东西我们并不关心,只关心它有没有正常执行。另一种是通过完全编程的方式来实现,详细的控制每一个步骤,需要知道转换执行的成功与否,这种方式可能需要更多的理解kettleAPI 以便更好的跟你的应用程序紧密结合,不过难度也比较大,可以很好的定制你的应用程序,代价自然是入门门槛比较高。本文主要向你解释第一种Kettle的集成方式,文中所列出的代码节选自pentaho ,不过应用程序本身跟pentaho 没有什么关系。
        Pentaho
    集成kettle的代码主要是两个类,KettleSystemListener KettleComponent,看名字就猜出KettleSystemListener 主要是起监听器的作用,它主要负责初始化kettle的一些环境变量,这个类主要包含四个方法: startup() ,readProperties(),environmentInit(),shutdown(),程序入口自然是startup()方法,然后它会调用 environmentInit() 方法,这个方法就调用readProperties()方法读一个配置文件kettle.properties,这个文件主要记录者kettle运行时可以调用的一些环境变量,关于kettle.properties文件怎么用,第二篇文章使用Kettle设计动态转换有提到,readProperties()方法读完这个文件之后就把里面的键值对转换成变量传给kettle运行环境.kettle运行完了之后就调用 shutdown()方法结束转换.KettleSystemListener相对逻辑比较简单,就不多介绍,下面主要介绍重点类:
    KettleComponent
    KettleComponent
    的方法主要有三种类型,一类是用来初始化工作,做一些验证工作,第二类是执行转换的方法,也是主要需要讨论的方法,第三类是取得数据结果的,有时候你需要得到转换的结果交给下一个步骤处理.下面分别讨论这三类方法。

    初始化
       KettleComponent
    的初始化工作主要是验证这个转换,包括有validateSystemSettings(),init(),validateAction(),全部都是public 方法,validateSystemSettings()会检查kettle 使用何种方式来连接资源库。
    kettle
    有两种方式连接资源库,一种是纯数据库式,也就是你所有的转换全部都保存在一个数据库中,一般你在开始使用kettle的时候,它都会要求你建立一个资源仓库,这个资源仓库的连接方式就是你的数据库连接,你需要能够有相应的数据库驱动和对应的连接用户名和密码。另外一种连接方式是使用文本文件,也就是xml文件,在做完任何转换之后,我们都可以把转换或者Job变成xml文件输出,这个输出文件包含你所有转换的全部信息。
    在示例应用中使用的是文件的连接方式,下面看一下初始化的一段代码:
    Boolean useRepository =PentahoSystem.getSystemSetting("kettle/settings.xml",
                                "repository.type","files").equals("rdbms");
    PentahoSystem.getSystemSetting
    ()方法只是返回一个字符串,使用的xpath读一个xml的对应字段,下面列出settings.xml文件:
    <kettle-repository>
      <!-- The values within <properties> are passed directly to theKettle Pentaho components. -->      
     <!-- This is the location of the Kettle repositories.xml file, leaveempty if the default is used: $HOME/.kettle/repositories.xml -->
     <repositories.xml.file></repositories.xml.file>
     <repository.type>files</repository.type>
     <!--  The name of the repository to use -->
     <repository.name></repository.name> 
     <repository.userid>admin</repository.userid> 
     <repository.password>admin</repository.password>  
    </kettle-repository>
    可以看到其中的repositories.xml.file 上面的一段注释,如果这个值为空会默认使用$HOME/.kettle/repository.xml文件当作资源库的连接文件,由于示例中使用的是文本文件所以没有用数据库连接,下面的repository.useridrepository.password是指的kettle的资源库连接的用户名和密码,一般默认安装就两个,admin/admin  guest/guest , 这里的用户名和密码不是连接数据库的用户名和密码,连接数据库的用户名和密码是在另外一个文件repositories.xml.file指定的值所定义的
    一般默认的kettle安装并且运行了一段时间之后,会在$HOME/.kettle 目录下创建一些文件,如果你要在自己的系统中集成kettle的话,也需要保留这些文件,当然不一定位置是在原来的位置,关键是要让kettle知道这些文件放在哪。

    执行转换
    当读完了这些配置文件并且验证了之后,KettleComponent就开始把前面读到的转换文件或者资源库类型变成KettleAPI,这主要是在executeAction()方法里面进行,它当然根据连接方式也分两种执行类型:
    1. 
    文本执行方式
    2. 
    资源库连接方式

    文本执行方式需要接受一个你指定的运行转换的文件或者Job的文件,然后把这个xml文件解析成Kettle能够执行的模式,
    根据执行的类型又可以分成两种:
    1. Trans
    任务
    2. Job
    任务
    两个执行的逻辑差不多,下面先介绍Trans的执行方式:

    执行Trans任务
    transMeta = new TransMeta(fileAddress, repository, true);
          transMeta.setFilename(fileAddress);
    然后它会调用:
    executeTransformation(TransMeta transMeta, LogWriter logWriter)
    这个方法是真正的把前面的来的transMeta转换成trans对象,等待下一步的执行:
    Trans trans = new Trans(logWriter, transMeta);
    List stepList = trans.getSteps();
    for (int stepNo = 0; stepNo < stepList.size(); stepNo++) {
          StepMetaDataCombi step = (StepMetaDataCombi)stepList.get(stepNo);
          if (step.stepname.equals(stepName)){                 
      
             Row row = transMeta.getStepFields(stepName);
                 // create the metadata that the Pentaho result set needs
           
          String fieldNames[] = row.getFieldNames();
                 String columns[][] = new String[1][fieldNames.length];
                 for (int column = 0; column < fieldNames.length; column++) {
                       columns[0][column] = fieldNames[column];
                 }
       
           MemoryMetaData metaData = new MemoryMetaData(columns, null);
                 results = new MemoryResultSet(metaData);
                 // add ourself as a row listener
       
          step.step.addRowListener(this);
                foundSte
    p = true;
                 break;
          }
    }
    1. Row
    对象是kettle用来表示一行数据的标准对象,跟jdbc取出来的一条数据转化后成为的一个POJO是一样的。里面可以包含多个字段。
    2 . MemoryMetaData
    对象是pentaho特有的,是专门用来返回ETL任务执行后的结果的,与标准的JDBC里面的resultSet 对应的resultSetMetaData  是一样的。
    3.
    对于如何处理数据的一个Listener,实现的是一个RowListener,数据是每一行每一行处理的,后面会介绍如果需要输出数据怎么取得这些输出数据。如果不需要放回任何对象,则从1处开始都可以不要,只要初始化step对象即可。

    所有的step对象都已经初始化之后就可以开始执行了,
    trans.startThreads();
    trans.waitUntilFinished();
    结束之后还有一些清理工作就不列出了。

    执行Job任务
    执行Job任务之前还是会读取Job任务的描述文件,然后把这个描述文件(kettle .ktr文件)变成一个xml文档的dom
    org.w3c.dom.Document doc = XmlW3CHelper.getDomFromString(jobXmlStr);
    之后也是初始化对应的元数据对象JobMeta
    jobMeta = new JobMeta(logWriter, doc.getFirstChild(), repository);
    得到了jobMeta 之后就可以执行这个Job了,这里跟trans是一样的。
    job = new Job(logWriter, StepLoader.getInstance(), repository, jobMeta);
    由于Job一般都没有什么返回值,所以Job不需要初始化它下面的对象,直接开始运行就可以了
    job.start();
    job.waitUntilFinished(5000000);

    连接资源库
    连接资源库使用的是connectToRepository()方法,先取得RepositoriesMeta对象,然后根据你在setting.xml文件里面定义的repository的名字来连接对应的repository.理论上来说我们一般都只使用一个 repository ,但如果在产品中需要使用多个repository的话,你需要自己配置多个repository的名字和对应的用户名和密码。只列出几行关键代码,
    repositoriesMeta = new RepositoriesMeta(logWriter);
    repositoriesMeta.readData(); //
    $HOME/.kettle/repositories.xml读数据.
    repositoryMeta = repositoriesMeta.findRepository(repositoryName);
    repository = new Repository(logWriter, repositoryMeta, userInfo);
    userInfo = new UserInfo(repository, username, password);

    从资源库读取Trans
    连接到资源库之后自然是想办法读取数据库的表,把里面的记录转换成为Trans 对象,使用的是loadTransformFromRepository,这个方法的函数原型需要解释一下:
    TransMetaloadTransformFromRepository(String directoryName, String transformationName,Repository repository,LogWriter logWriter)
    第一个参数String directoryName 代表是你储存转换的目录,当你使用kettle 图形界面的时候,点击repository菜单的explorer repository ,你会发现你所有的东西都是存储在一个虚拟的类似与目录结构的地方,其中包括database connections, transformations , job , users 等,所以你需要的是指定你连接的目录位置,你也可以在目录里面再创建目录。
    String transformationName
    自然指的就是你转换的名字.
    Repository repository
    指的是你连接的资源库。
    LogWriter logWriter
    指定你的日志输出,这个log 指的是你kettle 转换的日志输出,不是应用程序本身的输出。
    读取TransMeta的步骤也相对比较简单
    repositoryDirectory=repository.getDirectoryTree().findDirectory(directoryName);
    transMeta = new TransMeta(repository, transformationName, repositoryDirectory);

    从资源库读取Job
    从资源库读取JobTrans 的步骤基本是一样的,同样需要指定你存储Job的目录位置.
    JobMeta loadJobFromRepository(String directoryName, String jobName,
    Repository repository, LogWriter logWriter)

    读取结果集
    一般Job都是不会返回任何结果集的,大部分Trans也不会返回结果集,应为结果集一般都会直接从一个数据库到另一个数据库了,但是如果你需要返回转换的结果集,那么这一小结将会向你解释如何从一个Trans里面读取这些结果集
    首先,你需要一个容纳Result的容器,就是类似与JDBC里面的resultSet, resultSet当然会有一个resultSetMetadata跟它相关联,在本文所举的实例中,使用的是pentaho私有的memoryResultSet,
    你可以不用关心它的细节,并且它的类型正如它的名字一样是存在与Memory的,所以它不能被持久化,这个里面储存的是一个二维的Object数组,里面的数据就是从kettle转化之后来的。
    要从kettle的转换中读取结果集,要实现RowListener 接口,Row kettle里面表示一行数据的一个类,RowListener 自然是指在转换数据转换的时候发生的事件,它有三个方法需要实现,
    void rowReadEvent
    Row
    void rowWrittenEvent(Row)
    void errorRowWrittenEvent(Row)
    分别对应读数据时的事件,写数据事的时间,出错时的时间,我们需要取得结果集,所以只需要实现rowWrittenEvent(Row)就可以了,Row对象是通过TransMeta取得的,
    Row row = transMeta.getStepFields(stepName);
    下面给出具体实现取Row转换成resultSet的代码:
    Object pentahoRow[] = new Object[results.getColumnCount()];
        for (int columnNo = 0; columnNo <results.getColumnCount(); columnNo++) {
          Value value = row.getValue(columnNo);
          switch (value.getType()) {
            case Value.VALUE_TYPE_BIGNUMBER:
              pentahoRow[columnNo] =value.getBigNumber();
              break;
        ........

    results.addRow(pentahoRow);
    默认的数据类型是String 类型(在省略部分).
    整个代码最重要的一行是Value value = row.getValue(columnNo);
    这是真正取得实际数据的一行。有时候你会觉得实现一个resultSet比较麻烦,尤其是你还要实现相关的resultSetMetaData,怎么把数据转换成你自己的类型,你大可以就用一个List of List 来实现,里面的List 就代表Row 的对应数据,外面一层List 就是result , 整个代码会简单一些,当然,你要自己知道最后这个List怎么用.

    本文有意隐藏了一些跟pentaho有关的细节,比如validateSystemSettings(),init(),validateAction()方法,这些都是pentaho私有的,有些方法比如 rowWrittenEvent(Row)是用来取结果集的,但是很多时候我们不需要取转换的结果集,文中很多代码都只列出主要的部分,省略一些判断,调试,log部分的代码,大家可以自己下载这些代码来研究,
    本文并没有给出一个可以独立运行的示例,因为这个示例一定会太过于简单(不超过15行代码),但是却并不能考虑到各种情况,连接资源库还是文件,运行转换还是Job ,metadata怎么得来的,需不需要转换之后的结果。
    关于在本文一开始提到的使用kettle的两种方式,对于第二种使用方式:使用完全编程的方式来运行转换,其实它的与第一种方式的区别就好像一个用设计器来写xml文件,一个用纯手工方式写xml文件(用代码的xml,大家可以参考官方网站上的一段示例代码,地址如下:
    http://kettle.pentaho.org/downloads/api.php

    开源ETL工具kettle系列之增量更新设计

    ETL中增量更新是一个比较依赖与工具和设计方法的过程,Kettle中主要提供Insert / Update 步骤,Delete 步骤和Database Lookup 步骤来支持增量更新,增量更新的设计方法也是根据应用场景来选取的,虽然本文讨论的是Kettle的实现方式,但也许对其他工具也有一些帮助。本文不可能涵盖所有的情况,欢迎大家讨论。

    应用场景
    增量更新按照数据种类的不同大概可以分成:
    1. 
    只增加,不更新,
    2. 
    只更新,不增加
    3. 
    即增加也更新
    4. 
    有删除,有增加,有更新
    其中1 2 3种大概都是相同的思路,使用的步骤可能略有不同,通用的方法是在原数据库增加一个时间戳,然后在转换之后的对应表保留这个时间戳,然后每次抽取数据的时候,先读取这个目标数据库表的时间戳的最大值,把这个值当作参数传给原数据库的相应表,根据这个时间戳来做限定条件来抽取数据,抽取之后同样要保留这个时间戳,并且原数据库的时间戳一定是指定默认值为sysdate当前时间(以原数据库的时间为标准),抽取之后的目标数据库的时间戳要保留原来的时间戳,而不是抽取时候的时间。
      
    对于第一种情况,可以使用KettleInsert / Update 步骤,只是可以勾选Don’t perform any update选项,这个选项可以告诉Kettle你只会执行Insert 步骤。
    对于第二种情况可能比较用在数据出现错误然后原数据库有一些更新,相应的目标数据库也要更新,这时可能不是更新所有的数据,而是有一些限定条件的数据,你可以使用KettleUpdate 步骤来只执行更新。关于如何动态的执行限定条件,可以参考前一篇文章。
    第三种情况是最为常见的一种情况,使用的同样是 KettleInsert / Update 步骤,只是不要勾选Don’t perform any update 选项。
    第四种情况有些复杂,后面专门讨论。

    对于第123种情况,可以参考下面的例子。
    这个例子假设原数据库表为customers , 含有一个id , firstname ,lastname , age 字段,主键为id , 然后还加上一个默认值为sysdate的时间戳字段。转换之后的结果类似:id , firstname , lastname , age , updatedate . 整个设计流程大概如下:

     
                                                                           
    1
    其中第一个步骤的sql 大概如下模式:
    Select max(updatedate) from target_customer ;
    你会注意到第二个步骤和第一个步骤的连接是黄色的线,这是因为第二个table input 步骤把前面一个步骤的输出当作一个参数来用,所有Kettle用黄色的线来表示,第二个table input sql 模式大概如下:
    Select field1 , field2 , field3 from customers where updatedate > ?
    后面的一个问号就是表示它需要接受一个参数,你在这个table input 下面需要指定replace variable in script选项和execute for each row 为选中状态,这样,Kettle就会循环执行这个sql , 执行的次数为前面参数步骤传入的数据集的大小。
     
                                                                               
    2

    关于第三个步骤执行insert / update 步骤需要特别解释一下,
     
                                                                                       
    3

    Kettle执行这个步骤是需要两个数据流对比,其中一个是目标数据库,你在Target table 里面指定的,它放在The keys to look upthe values(s) 左边的Table field 里面的,另外一个数据流就是你在前一个步骤传进来的,它放在The keys to look upthe value(s) 的右边,Kettle首先用你传进来的key 在数据库中查询这些记录,如果没有找到,它就插入一条记录,所有的值都跟你原来的值相同,如果根据这个key找到了这条记录,kettle会比较这两条记录,根据你指定update field 来比较,如果数据完全一样,kettle就什么都不做,如果记录不完全一样,kettle就执行一个update 步骤。所以首先你要确保你指定的key字段能够唯一确定一条记录,这个时候会有两种情况:
    1.
    维表
    2.
    事实表
    维表大都是通过一个主键字段来判断两条记录是否匹配,可能我们的原数据库的主键记录不一定对应目标数据库中相应的表的主键,这个时候原数据库的主键就变成了业务主键,你需要根据某种条件判断这个业务主键是否相等,想象一下如果是多个数据源的话,业务主键可能会有重复,这个时候你需要比较的是根据你自定义生成的新的实际的主键,这种主键可能是根据某种类似与sequence 的生成方式生成的,
    事实表在经过转换之后,进目标数据库之前往往都是通过多个外键约束来确定唯一一条记录的,这个时候比较两条记录是否相等都是通过所有的维表的外键决定的,你在比较了记录相等或不等之后,还要自己判断是否需要添加一个新的主键给这个新记录。
    上面两种情况都是针对特定的应用的,如果你的转换过程比较简单,只是一个原数据库对应一个目标数据库,业务主键跟代理主键完全相同的时候完全可以不用考虑这么多。

    有删除,有增加,有更新
    首先你需要判断你是否在处理一个维表,如果是一个维表的话,那么这可能是一个SCD情况,可以使用KettleDimension Lookup 步骤来解决这个问题,如果你要处理的是事实表,方法就可能有所不同,它们之间的主要区别是主键的判断方式不一样。
    事实表一般都数据量很大,需要先确定是否有变动的数据处在某一个明确的限定条件之下,比如时间上处在某个特定区间,或者某些字段有某种限定条件,尽量最大程度的先限定要处理的结果集,然后需要注意的是要先根据id 来判断记录的状态,是不存在要插入新纪录,还是已存在要更新,还是记录不存在要删除,分别对于id 的状态来进行不同的操作。
    处理删除的情况使用 Delete步骤,它的原理跟Insert / Update 步骤一样,只不过在找到了匹配的id之后执行的是删除操作而不是更新操作,然后处理Insert / Update 操作,你可能需要重新创建一个转换过程,然后在一个Job 里面定义这两个转换之间的执行顺序。
    如果你的数据变动量比较大的话,比如超过了一定的百分比,如果执行效率比较低下,可以适当考虑重新建表。
    另外需要考虑的是维表的数据删除了,对应的事实表或其他依赖于此维表的表的数据如何处理,外键约束可能不太容易去掉,或者说一旦去掉了就可能再加上去了,这可能需要先处理好事实表的依赖数据,主要是看你如何应用,如果只是简单的删除事实表数据的话还比较简单,但是如果需要保留事实表相应记录,可以在维表中增加一条记录,这条记录只有一个主键,其他字段为空,当我们删除了维表数据后,事实表的数据就更新指向这条空的维表记录。

    定时执行增量更新
    可能有时候我们就是定时执行更新操作,比如每天或者一个星期一次,这个时候可以不需要在目标表中增加一个时间戳字段来判断ETL进行的最大时间,直接在取得原数据库的时间加上限定条件比如:
    Startdate > ? and enddate < ?
    或者只有一个startdate
    Startdate > ?   (
    昨天的时间或者上个星期的时间)
    这个时候需要传一个参数,用get System Info 步骤来取得,而且你还可以控制时间的精度,比如到天而不是到秒的时间。
    当然,你也需要考虑一下如果更新失败了怎么处理,比如某一天因为某种原因没有更新,这样可能这一天的记录需要手工处理回来,如果失败的情况经常可能发生,那还是使用在目标数据库中增加一个时间字段取最大时间戳的方式比较通用,虽然它多了一个很少用的字段。

    执行效率和复杂度
    删除和更新都是一项比较耗费时间的操作,它们都需要不断的在数据库中查询记录,执行删除操作或更新操作,而且都是一条一条的执行,执行效率低下也是可以预见的,尽量可能的缩小原数据集大小。减少传输的数据集大小,降低ETL的复杂程度

    时间戳方法的一些优点和缺点
    优点实现方式简单,很容易就跨数据库实现了,运行起来也容易设计
    缺点:浪费大量的储存空间,时间戳字段除ETL过程之外都不被使用,如果是定时运行的,某一次运行失败了,就有可能造成数据有部分丢失.

    其他的增量更新办法:
    增量更新的核心问题在与如何找出自上次更新以后的数据,其实大多数数据库都能够有办法捕捉这种数据的变化,比较常见的方式是数据库的增量备份和数据复制,利用数据库的管理方式来处理增量更新就是需要有比较好的数据库管理能力,大多数成熟的数据库都提供了增量备份和数据复制的方法,虽然实现上各不一样,不过由于ETL的增量更新对数据库的要求是只要数据,其他的数据库对象不关心,也不需要完全的备份和完全的stand by 数据库,所以实现方式还是比较简单的.,只要你创建一个与原表结构类似的表结构,然后创建一个三种类型的触发器,分别对应insert , update , delete 操作,然后维护这个新表,在你进行ETL的过程的时候,将增量备份或者数据复制停止,然后开始读这个新表,在读完之后将这个表里面的数据删除掉就可以了,不过这种方式不太容易定时执行,需要一定的数据库特定的知识。如果你对数据的实时性要求比较高可以实现一个数据库的数据复制方案,如果对实时性的要求比较低,用增量备份会比较简单一点。

    几点需要注意的地方:
    1.
    触发器
    无论是增量备份还是数据复制,如果原表中有触发器,在备份的数据库上都不要保留触发器,因为我们需要的不是一个备份库,只是需要里面的数据,最好所有不需要的数据库对象和一些比较小的表都不用处理。
    2.
    逻辑一致和物理一致
    数据库在数据库备份和同步上有所谓逻辑一致和物理一致的区别,简单来说就是同一个查询在备份数据库上和主数据库上得到的总的数据是一样的,但是里面每一条的数据排列方式可能不一样,只要没有明显的排序查询都可能有这种情况(包括group by , distinct ,union等),而这可能会影响到生成主键的方式,需要注意在设计主键生成方式的时候最好考虑这一点,比如显式的增加order 排序. 避免在数据出错的时候,如果需要重新读一遍数据的时候主键有问题.

    总结
       
    增量更新是ETL中一个常见任务,对于不同的应用环境可能采用不同的策略,本文不可能覆盖所有的应用场景,像是多个数据源汇到一个目标数据库,id生成策略,业务主键和代理主键不统一等等,只是希望能给出一些思路处理比较常见的情况,希望能对大家有所帮助。

    开源ETL工具kettle系列之动态转换

    摘要:本文主要讨论使用Kettle来设计一些较为复杂和动态的转换可能使用到的一些技巧,这些技巧可能会让你在使用Kettle的时候更加容易的设计更强大的ETL任务。

    动态参数的传递
    Kettle
    在处理运行时输入参数可以使用JavaScript 来实现,大部分工作只是按照一个模板来处理的
    动态参数传递主要使用在像数据清理,调式,测试,完成复杂的条件过滤等等,这种方式一般不会在产品已经运行稳定了一段时间之后使用,因为我们一般仍然是做定时任务来自动转换数据,所以在开始介绍如何使用动态参数之前,希望大家能明白不要在产品数据库上做实验,即使你已经知道你的转换有什么影响并且做了备份,因为这种方法是不可能自动执行的。
    Kettle
    有两种动态参数传递的方法,一种是非常轻量级的传argument , 另一种是对付较复杂一点情况使用JavaScript . 下面分别介绍这两种方法。
    1. argument
    当你在运行一个转换的时候,不管这个转换是一个Job的一部分还是只有这个转换,你都可以传递参数给它,当你运行一个转换的时候,会弹出一个 Execution aTransformation 的对话框,让你选择执行转换的方式,本地执行,远程执行,分布式执行,下面就是日志记录的级别和回放时间,然后是argument variables 的设定。Argument variables 的区别在官方FAQ里面也有解释。你也可以参考一下官方的解释和下面解释的异同。
    Q : Argument
    variables 的区别 /
    A : variables
    也可以认为叫做environment variables , 就像它的名字一样,主要是用来设定环境变量的,比如最常见的:文件的存放地址,smtp的配置等等,你也可以把它认为是编程语言里面的全局变量,即使是不同的转换它们也拥有同样的值,而argument 自然就类似与局部变量,只针对一个特定的转换,比如像是限定结果集的大小和过滤条件。

    取得argument的值
    我们在转换之前设置了argument的值,需要用到的时候就使用get system info 步骤,这个步骤取得在运行时参数,需要注意的是我们是先设置get system info ,然后在里面决定要使用多少个参数,最多10个,每个参数名叫什么,然后我们才能在运行时看到你设置了的参数名后面跟一个要你输入的值,并且参数类型是不能够指定,全部都当作字符串处理,如果你需要对参数类型有要求,你需要自己转换,使用一个Mapping步骤或者Select values步骤。
    取得variable的值
    Variable
    的值个数不受限制,你可以在kettle菜单的set environment里面设置,也可以使用文件储存这些值,在第一次运行kettle之后,kettle会在%HOME_USER_FOLDER%菜单里面创建一个 .kettle文件夹,如果是windows 用户可能就是C:\Documents andSettings\${your user name}\.kettle这个文件夹,如果是linux用户可能就是/home/${your user name }/.kettle文件夹,这个文件夹下面有kettle.properties文件,如果你打开这个文件,你会发现里面有一些以#开头的注释,其中设置了一些像是:PRODUCTION_SERVER = Hercules 这样的键值对,你可以自己定义一些环境变量比如像是smtp的地址,ftp服务器的地址,你放log文件的目录名等等,当然不能直接编辑这个文件就设置环境变量,要先设置KETTLE_HOME环境变量,windows就是点我的电脑,然后在设置path的那个地方添加一个KETTLE_HOME变量,linux就是export KETTLE_HOME=’一个目录,这个目录可以任意地方,不过一般还是指向kettle的安装目录或是你自己的文档目录,然后启动kettle它会创建一个新的.kettle目录,编辑里面的kettle.properties文件就可以设置环境变量了.


    2. 使用脚本
    Kettle
    使用的是JavaScript来作为它的脚本实现,使用的是mozilla rhino 1.5r5版本实现,如果你打算实现一些复杂的计算过程,比如字符串分割,数据类型转换,条件计算等等,你都应该使用脚本语言来搞定。
    我们在某种应用环境下使用脚本语言来实现一些动态的功能大部分原因都是为了避免编程,一个复杂一点的应用程序,比如像是Kettle这种工具,或是报表工具,它们不可能提供全部功能,把什么都做成图形化,应用条件永远都是复杂的,如果你不想研究代码和程序的结构,甚至你都不知道怎样编程,脚本语言绝对是一种简单的解决方案,而JavaScript语言又是其中入门门槛非常低的一种,你完全可以多看一些例子,尝试模仿一些脚本来解决问题,也许会有一点难以调试和测试,但总比自己编程要好的多。
    下面的这个例子将会使用JavaScript弹出一个对话框来接受两个参数,都是时间类型,其中的UI组件是使用的swt 的一些类,Kettle使用的是swt 作为其UI组件,如果你对swt 有了解的话会更容易理解这些UI组件,当然这并不需要你有swt 编程的经验或者其他GUI设计的经验。
    打开Kettle 下载目录下的samples /transformation / JavaScript dialog.ktr 文件(使用Kettle File 菜单里面的import from an xml file 。你会看到一个包含3个步骤的转换。
    第一个步骤使用generate rows 产生一条测试数据,测试数据包含一个DateFromProposal 时间字段和一个DateToProposal时间字段。
    第二个步骤使用JavaScript 来实现动态的参数转变,它会连续弹出两次对话框,要求输入一个起始值和结束值,然后它会调用一些JavaScript 函数来对日期格式做一些处理,
    第三个步骤使用Dummy 来接受输入,你完全可以使用File output 步骤来查看输出。

    我们先看一下第二部中的JavaScript代码:(删掉了开头的注释)
    var display;
    var displayHasToBeDisposed=false;
    var shell=null;

    try {
       display=Packages.org.eclipse.swt.widgets.Display.getCurrent();
        shell=display.getActiveShell();
    } catch(e) {
        // if it runs in batch mode (Pan or preview mode) no Displayis available, so we have to create one
        display=new Packages.org.eclipse.swt.widgets.Display();
        displayHasToBeDisposed=true;
        shell=new Packages.org.eclipse.swt.widgets.Shell(display);
    }

    // if we run in Panwe need to load the properties:
    if(!Packages.org.pentaho.di.ui.core.PropsUI.isInitialized()) {
        Packages.org.pentaho.di.ui.core.PropsUI.init(display,2);//2=TYPE_PROPERTIES_PAN
    }

    vardateDefaultFrom=DateFromProposal.getString().substr(0,10); //only the date andnot the time
    var dialogDateFrom=new Packages.org.pentaho.di.ui.core.dialog.EnterTextDialog(shell,"Date from", "Please enter the beginning date",dateDefaultFrom);
    var dateFromAsString=dialogDateFrom.open();

    if(dateFromAsString!=null&& dateFromAsString.length()>0) {
        var dateDefaultTo=DateToProposal.getString().substr(0,10);//only the date and not the time;
        var dialogDateTo=newPackages.org.pentaho.di.ui.core.dialog.EnterTextDialog(shell, "Dateto", "Please enter the ending date", dateDefaultTo);
        var dateToAsString=dialogDateTo.open();
        if(dateToAsString!=null &&dateToAsString.length()>0) {
            // here you could check or changeformats a.s.o
        } else {
            // stop transformation when usercancels
            throw newPackages.java.lang.RuntimeException("Input canceled by the user.");
        }
    } else {
        // stop transformation when user cancels
        throw new Packages.java.lang.RuntimeException("Inputcanceled by the user.");
    }

    if(displayHasToBeDisposed){
      display.dispose();
    }
    Display
    shell 都是swt 里面的对象,你只用知道他们是表示UI的就可以了.
    DateFromProposal
    DateToProposal都是前面传过来的字段,dateFromAsStringdateToAsString都是需要输出的内容,整个脚本只是简单的取了两个日期变量的时间部分,使用了字符串操作的substr()函数。
    其中有三点需要注意:
    1. dialog
    对象的初始化方式:使用的构造函数类型为
    EnterTextDialog(Shell parent, String title, String message, String text) ,
    另一种构造函数类型是加一个参数fixed :
    EnterTextDialog(Shell parent, String title, String message, String text,boolean fixed)
    fixed
    代表字体是否用固定宽度,text参数代表的是输入在对话框里面的值,一般可以默认为空或输入一段用户提示信息,例子中是设置成原先转换之前的值,相当于默认值。
    2. 
    使用open()函数取得输入值
    我们调用dialog open()函数取得输入的值。
    3. 
    异常的处理方式
    基本上是一个标准的java 语法的try catch throw .
    最后运行一下并查看输出,运行的时候什么都不输入接受默认值就可以了,最后查看输出,以下是文本方式的输出,以分号分割
    DateFromProposal;DateToProposal;dateFromAsString;dateToAsString
    2006/01/01 00:00:00.000;2006/12/31 00:00:00.000;2006/01/01;2006/12/31

    最后需要注意的是这种方式的实现可能将来会直接用一个新的step来实现,不用这样写脚本。

    调试
    调试可不是程序的专利,ETL过程同样需要调试过程,Kettle同样支持比较简单的调试过程,你可能已经发现了在菜单下面的工具栏下面有一个debug preview 按钮来支持调试过程,这种调试的技巧同样可以用来帮助你完成一些复杂的ETL工程,下面以一个例子来解释调试过程.
    首先,打开samples / add sequence specify a common counter.ktr 文件,你会发现一个定义了两个sequence 的转换,点击debug按钮,它会弹出一个Transformation debug dialog 窗口。
     
                                                                             
    1

    这个窗口左边列出了在这个转换中所有的步骤,我们选取Generate ID 步骤,然后设置断点的条件:
    Kettle
    支持两种断点的方法,一种基于限定结果集的数量大小,另一种是基于条件的判断过程。
    我们选择基于结果集大小的方式,只查看前面5条数据。
    你会看到Kettle列出了Generate ID 步骤产生的前面5条数据,
     
                                         
    2

    从上图中可以看到这个generate id 步骤产生了5个值并不是连续的,下面的按钮Close ,Stop 可以控制当前线程是继续还是停止.

    利用调试的方法可以帮住我们设计一些需要基于条件判断的复杂ETL过程,我们使用调试的方法来查看数据中是否可能存在某些特定数据,以此来设计一些ETL过程针对这些数据进行处理。

    开源ETL工具kettle系列之建立缓慢增长维

    摘要:本文主要介绍使用kettle 来建立一个Type 2Slowly Changing Dimension 以及其中一些细节问题

    1. Kettle 简介
    Kettle
    是一个强大的,元数据驱动的ETL工具被设计用来填补商业和IT之前的差距,将你公司的数据变成可增长的利润.

    我们先来看看Kettle能做什么:
    1. Data warehouse population with built-in support for slowly changingdimensions, junk dimensions and much, much more.
    2. Export of database(s) to text-file(s) or other databases
    3. Import of data into databases, ranging from text-files to excel sheets
    4. Data migration between database applications
    5. Exploration of data in existing databases. (tables, views, synonyms, )
    6. Information enrichment by looking up data in various information stores(databases, text-files, excel sheets, )
    7. Data cleaning by applying complex conditions in data transformations
    8. Application integration

    本系列文章主要介绍如下几点:
    1.
    数据仓库内建支持缓慢增长维SCD ,
    2.
    在数据转换中使用复杂条件判断来清理数据
    3.
    如何使用kettle 来处理增量更形
    4.
    Kettle 集成到你的应用程序里
    5.
    使用kettle中应该注意的一些地方
    2. Kettle
    文档
    最好的kettle教程就在你身边,我们下载的kettle-version. zip 文件里其实已经包括了非常多的示例和文档,在你的kettle文件夹下,docs 文件夹下包含了所有的文档,samples文件夹下包含了一些示例,后面的介绍中一部分示例都来自kettle自带的这个示例文件夹下。docs里面最主要的是Spoon-version-User-Guide.zip ,里面记录了kettle 的技术性文档,包括支持的操作系统,数据库平台,文本格式,图形化的界面,其中最重要的是所有的转换对象(Transformation CoreObjects) Job对象(Job Core Objects) 的解释,包括截图和每一个参数的解释。

    3. Kettle
    Slowly Changing Dimension
     
    我们使用kettle自带的samples文件下的示例,来看kettle如何支持SCD的。
    打开samples / jobs / Slowly Changing Dimension 文件夹,发现里面有三个文件,
    create - populate - update slowly changing dimension.kjb
    DimensionLookup - update dimension table 2.ktr
    DimensionLookup - update dimension table.ktr
    其中后缀以 .kjb 结尾的是kettle job 文件导出的格式,而以ktr 结尾的是kettle transformation 导出的格式,打开其中的DimensionLookup -update dimension table.ktr , 出现如下所示
     
       
    1
    1.
    最左边的是产生测试数据,如果是实际环境的话应该是连接真实的数据库,产生的真实数据格式打开如下:

       
    2
    2
    第二个步骤Dummy 就是把前面的数据合并起来,Dummy 步骤本身不做任何事情,不过由于前面有四个输入指向它,所以它在第二步的作用等同于数据合并。
    3
    第三个步骤是取得系统参数(get system date) , 它取得当前系统时间的日期,并且格式是当天的 00:00:00 , 如图所示


        4.
    最后一步是真正的重点,执行Dimension Lookup /Update 步骤来更新和插入数据,以此来实现Type 1 ,2 ,3 的不同Slowly Changing Dimension 
       
          
    4

                                                                     
    5
      
    在开始介绍Dimension Lookup /Update 之前,先看看在执行这个步骤之前的输入和输入:
      
    输入

    字段名

    数据类型

    说明

    id

    int

    前面步骤的输入

    name

    Varchar(50)

    前面步骤的输入

    firstname

    Varchar(50)

    前面步骤的输入

    updated

    time

    从第三步来的时间参数

    输出:

    字段名

    数据类型

    说明

    id

    INT

    来自输入

    name     

    varchar(50)

    来自输入

    firstname

    varchar(50)

    来自输入

    customer_tk

    BIGINT

    代理主键

    version

    INT

    版本变更号

    Date_from

    datetime

    有效期起始日期

    Date_to

    Datetime

    有效期失效日期

       注意: 上图中所使用的是mysql 5 数据库做测试,所以数据类型一栏都是mysql 的数据类型,如果你使用其他数据库,可能数据类型会有所不同,其中的datetime 的格式 yyyy/mon/day hh:mm:ss:sss

     

    我们再来看看当我们第一次运行以后出现的数据输出:
     
    6

    注意图6中所有的 version 值都是
    Date_from
    都是 1900/01/0100:00:00.000
    Date_to  
    都是 2199/12/3123:59:59.000      这两列都是根据图4下面部分定义的
    Id , name , firstname
    都是测试数据,从前面步骤来的.

    然后我们修改图1generate row 的部分数据(一共两条),并且只有测试数据变了的情况下,我们再次运行转换,查看数据输出:
     
                                                                             
    7


    注意到其中customer_tk 并没有什么变化,仍然在产生类似序列的输出
    Version
    的值中出现了 2 , 并且只有在我们改变的数据中
    在出现了改变的行中的date_from 变成了2007/11/28/00:00:00.000
    在出现了改变的行中原来数据的date_to 变成了 2007-11-2800:00:00.000
    Id
    列没有变化,(变化了也没用,图5中的中间部分 Field 选项卡没有选id
    Name , firstname
    有两个值变了(我们手工改变的)

    Dimension Lookup / Update 参数解释 

     

    Step name

    步骤的名称,在一个转换中必须是唯一的

    Update the dimension?

    当找到符合条件记录的时候更新这条记录,如果这个复选框没有选择,找到了符合条件记录的时候就是插入新纪录而不是更新

    Connection

    数据库连接的名字

    Target schema

     

    Target table

    要更新的维表的名称

    Commit size

    批处理更新的记录数

    Cache size in rows

    这是把维表的数据放在缓存中用来提高数据查找速度从而减少数据库查询的次数

    注意只有最近一次的记录会被放在缓存中,如果记录数超过缓存大小,最有最有关的最近的最高版本号记录会被放在缓存中

    如果把cache size 设置成0 kettle会一直把记录放在缓存中直到JVM没有内存了,如果你这样设置要确保维的记录数不要太大

    设置成 1 表示不使用缓存

    Keys tab

    设置在流中的主键和目标维表的业务主键,当两个键相等时认为这条记录匹配

    Fields tab

    设定要更新的字段,当主键记录匹配的时候,只有设定更新的字段不一样才认为是这条记录是不一样的,需要更新或者插入(注意图5的中间部分,Fields tab 右边设定的是Insert ,所以实现的是Type2 SCD

    Technical key field

    维的主键,也可以叫做代理主键(Surrogate Key)

    Creation of technical key

    指定技术主键的生成方式,对于你数据库连接不适合的方式会自动被去掉,一共有三种:

    1 .Use table maximum + 1 : 使用当前表最大记录数加一的方式产生新主键,注意新的最大值会被缓存,所以不用每次需要产生新记录的时候就计算

    2 . Use sequence : 使用一个数据库支持的序列来产生技术主键(比如Oracle ,你也可以看到图4中这一条是灰色的因为使用的是mysql 数据库)

    3. Use auto increment field : 使用一个数据库支持的自动增长来产生技术主键(比如DB2

    Version field

    使用这个字段来储存版本号

    Stream Datafield

    你可以指定维记录最后一次被更改的时间,它能指定你要更新的维的精度,如果不指定,就会默认是系统时间

    Date range start field

    维记录其实有效时间

    Table daterange end

    维记录失效时间

    Get Fields button

    指定所有你想要更新的字段,除了你指定的主键

    SQL button

    产生sql 来创建维表


    官方文档中提到的注意事项:

    1. Stream date field :
    如果你不想每次都改变时间的范围,你需要添加一个额外的这个字段,比如你打算每天的午夜来进行ETL过程,可以考虑加一个Join 步骤”Yesterday 23:59:59” 作为输入的时间字段.
    2.
    这必须是一个Date 字段(不能是转换后的字符串,即使他们有相同的格式也不行),我们(Kettle 的开发小组)把功能实现隔离出来,如果你需要的话自己要先转换.
    3.
    对于Date range start andend fields : 你只能指定一个表示年的数据,而不是时间戳,如果你输入YYYY(比如2100) ,这将会被当成一个时间戳来用: YYYY-01-0100:00:00.000 ,(注意图6中的格式)

    另外需要注意的地方:
    1. Technical key field :
    其他一些ETL工具(比如OWB)也许叫做代理主键,只是名字上不同而已.
    2. SQL Button :
    当你在目标数据库中还没有建立维表的时候,你点击SQL Button ,Kettle 会弹出如下对话框帮你建立维表,你会发现它默认帮你在代理主键和业务主键上建立索引。

       
    8

    3 Creation of technical key
    在这个选项的第二种实现方式上,Use sequence ,这个要视你数据库支持而定,mysql 就不支持,Oracle 支持sequence , 但是你要自己创建和管理这个sequence , 如果这个sequence 的值因某种外部因素改变了,你要自己确定sequence 产生的值处于何种状态,如果可以的话尽量不要用,尽量用第一种:table maximum + 1 ,这种方式永远不要担心数据库的不同和实现方式的不同,而且简单易懂。

    4 Stream Datefield
        4.1
    这个选项是用来控制时间的精度的,有的时候我们可能只是一个月进行一次ETL,这个时候Datefield 显然没有必要到秒的精度,而且这个选项严重影响你后面如果使用缓慢增长维的sql 的复杂度,因为你需要先把时间的精度调到你需要的精度,比如你使用的数据是到秒的精度,但是你实际需要的只是天的精度,你在sql 里面有大量的时间都浪费在toString( stream date field) ,然后把这个字符串substring() ,执行效率会低一些.

        4.2
    不要轻易改这个精度,一旦你确定了精度问题,不要尝试改变它,尤其是当精度变细的时候,你可能会损失掉已经存在与数据库中的数据的精度,如果你只是从 “Today 00:00:00.000”改成 “Today 23.59.59.000” 的情况,需要手动处理好已经存在的数据格式问题.

        4.3
    执行ETL的时间可能决定这个值,如果你一天可能存在5次执行ETL过程(包括自动执行或者手工执行)那么你显然不希望时间的精度是按天来计算的(比如Today 00.00.00这种格式)

        4.4
    精度的损失并不可怕:考虑一下你的应用场景,比如我们要做表,列出200611月份和200612月份的所有销售总和,结合上图中的customer 的例子,假设是按客户聚合的, 我们对于customer 的精度要求只要求到月,没有要求到天,如果我们执行ETL的过程是一个星期执行一次,可能一个客户在一个星期内改变了三次他的名字(虽然不是个好例子,完全是为了配合上面的图),而只有最后一次的改变被记录了下来,这完全跟你执行ETL的频度有关,但是考虑到用户需求,只要精度到月就够了,即使这种精度有数据损失也完全没关系,所以你如何指定你的Stream date field 的精度主要是看用户需求的精度。

    4.5
    如果以上四点你觉得只是一堆让你头疼的字符串,那你完全可以把stream date field 设置成空(默认的到时间戳的精度)
    执行Type 2 SCD
    1. “Update the dimension?”
    选中
    2.
    Field tabs 里面,对于每一个你想要保持全部记录的字段都要选择Insert 方式.

    错误处理和依赖问题
       
    如果你运行了这个转换,你会发现你的输出中有一条customer_tk1version1的数据,你在图6和图7中没有看到这条数据是因为我不想一开始把这条数据跟SCD的实现混在一起,SCD的实现本身并不会告诉你要添加这条数据,这完全是跟数据建模有关系,为了理解这个问题,我们看一下如下情况该如何处理:

       
    一个产品销售的记录是作为一个立方体的主要事实表,它包括一个客户维,现在因为某种原因客户维需要删除掉一部分数据,但是对映的产品销售记录却要保存起来,该如何处理外键约束的问题?

        SCD
    实现本身并不会考虑这个问题,因为它跟维表没有什么关系,你要处理的是事实表里面那些引用了维表的记录,如果你没有这个空行(它唯一的一个值就是 id ,而且是为了满足主键约束,version那个字段有没有值不重要),事实表中的记录就不好处理这种情况,因为你把它赋予任何一个值都是不合适的。这种方法是为了处理像数据依赖(外键的关系)和错误处理比较常见的方法。

    1

     

    展开全文
  • 几种常见代码管理工具比较(2009)

    千次阅读 2016-05-20 11:12:57
    软件配置管理(Configuration Management)是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。...所以初学者最好避开这些理论,先去实践一个最基本的代码管理工具,如果公司Cl
    软件配置管理(Configuration Management)是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。
    

    初读上述定义,感觉不是一点点的有点绕口,枯燥和眩晕了,实际上如果仔细去研究软件工程的理论书籍,有一大堆关于配置管理的概念,定义,理论,工具,总之就是一些把初学者搞晕的东东。所以初学者最好避开这些理论,先去实践一个最基本的代码管理工具,如果公司有Clearcase环境当然是学习Clearcase比较好,如果没有,下载一些共享的代码管理,如CVS(现在已经升级到SVN了),安装在自己的电脑上,把自己的HelloWorld代码全部用这些代码管理工具管理起来,就是基本的配置管理了,如果再改进一下HelloWorld,做一个2.0版本,那就已经初窥门径了。当然,路漫漫其修远兮,推开一扇门,后面是汪洋大海,慢慢的遨游吧。

    笔者有幸接触过以下几种常用的配置管理工具:VSS、SVN、Clearcase,在此做一个小小的总结,并Ctrl+C了以前一些网友的对比评论,不一定准确,只是希望通过这些总结对自己和初学者有所帮助。如果想进一步了解这些工具,请baidu和google,如果想深入了解,敬请到图书馆借书并实践。

    一、 Visual Source Safe( 简称 VSS )

    VSS是微软的产品,是配置管理的一种很好的入门级的工具。VSS最初的名字叫Source Safe,是一家小公司的产品,92年曾经获了最佳小型管理工具奖,然后立即被微软收购。但是微软收购的只是source safe的Windows版本,在美国还有另外两家公司分别获得了继续开发和销售source safe的Mac版本和Unix版本的许可,在MS买进vss之后,基本上没有对vss进行任何的研发,MS内部自身也不用vss。

    SourceSafe长得很象早先土气的文件管理器,的确难看。但是难看不碍事,SourceSafe的优点可以用8个字来概括“简单易用,一学就会”,这个优点是它老妈Microsoft遗传下来的,是天生的。虽然SourceSafe并不是免费的,但是在国内人们以接近于零的成本得到它,网上到处可以下载啊。当然Microsoft也不在乎这个小不点的软件,它属于“买大件送小件”的角色。如果你合法地得到Visual Studio,你就得到了免费的SourceSafe。

    评价如下:

    易用性:★★★★★

    易学易用是 VSS 的强项, VSS 采用标准的 windows 操作界面,只要对微软的产品熟悉,就能很快上手。 VSS 的安装和配置非常简单,对于该产品,不需要外部的培训(可以为公司省去一笔不菲的费用)。只要参考微软完备的随机文档,就可以很快的用到实际的工程当中。

    功能:★★★

    VSS 的配置管理的功能比较基本,提供文件的版本跟踪功能,对于 build 和基线的管理, VSS 的打标签的功能可以提供支持。 VSS 提供 share (共享 ) 、 branch( 分支)和合并( merge) 的功能,对于团队的开发进行支持。 VSS 不提供对流程的管理功能,如对变更的流程进行控制。 VSS 不能提供对异地团队开发的支持。此外 VSS 只能在 windows 平台上运行,不能运行在其他操作系统上。

    安全性:★★★

    VSS 的安全性不高,对于 VSS 的用户,可以在文件夹上设置不可读,可读,可读 / 写 , 可完全控制四级权限。但由于 VSS 的文件夹是要完全共享给用户后,用户才能进入,所以用户对 VSS 的文件夹都可以删除。这一点也是 VSS 的一个比较大的缺点。

    总体成本:★★★★

    VSS 没有采用对许可证进行收费的方式,只要安装了 VSS ,对用户的数目是没有限制的。因此使用 VSS 的费用是较低的。

    技术支持:★★★★★

    由于 VSS 是微软的产品,可以得到稳定的技术支持。

    二、 SVN(Subversion) - CVS(Concurrent Version System)的替代和升级版本

    先说说CVS,CVS是开源代码的配置管理工具,其源代码和安装文件都可以免费下载。记得在学校读研的时候,学校实验室的代码全部都用CVS管理,为啥?很简单,两个字:免费!它与Eclipse配合,基本上 Java 的代码编写,代码管理和版本管理都可以“免费”搞定了。

    SVN(Subversion)是近年来崛起的版本管理工具,被誉为cvs的接班人。目前,绝大多数开源软件都使用svn作为代码版本管理软件。虽然在 2006年时SVN的使用族群仍然远少于传统的CVS,但已经有许多开放源码团体决定将CVS转换为SVN。已经转换使用SVN的包括了 FreeBSD、Apache Software Foundation、KDE、GNOME、GCC、 Python 、Samba、Mono 以及许多团体。许多开发团队换用SVN是因为 Trac、SourceForge、CollabNet、CodeBeamer等专案协同作业软件以及Eclipse、NetBeans等IDE提供SVN的支援整合。 除此之外,一些自由软件开发的协作网如SourceForge.net除了提供CVS外,现在也提供专案开发者使用SVN作为原码管理系统,JavaForge、Google Code以及 BountySource 则以SVN作为官方的源码管理系统。2009年,绝大多数CVS服务已经改用SVN。CVS已经停止维护。

    易用性 : ★★★★

    Subversion支持linux和windows,更多是安装在linux下。svn服务器有2种运行方式:独立服务器和借助apache。2种方式各有利弊。目前业界评价的SVN易用性正在提高。

    功能:★★★★

    SVN 的功能除具备 VSS 的功能外,还具有:

    它的客户机 / 服务器存取方法使得开发者可以从任何因特网的接入点存取最新的代码;它的无限制的版本管理检出 (checkout :注 1)的模式避免了通常的因为排它检出模式而引起的人工冲突;它的客户端工具可以在绝大多数的平台上使用。同样, SVN 也不提供对变更流程的自动管理功能。

    安全性:★★★★

    一般来说, SVN 的权限设置单一,无法完成复杂的权限控制;但是 SVN 通过 SVN ROOT 目录下的脚本,提供了相应功能扩充的接口,不但可以完成精细的权限控制,还能完成更加个性化的功能。

    总体成本:★★★★★

    SVN 是开发源码软件,无需支付购买费用。

    技术支持:★★★

    同样因为 SVN 是开发源码软件,没有生产厂家为其提供技术的支持。如发现问题,通常只能靠自己查找网上的资料进行解决。

    三、 ClearCase

    Rational公司的ClearCase是软件行业公认的功能最强大、价格最昂贵的配置管理软件。

    ClearCase主要应用于复杂产品的并行开发、发布和维护,其功能划分为四个范畴: 版本控制 、工作空间管理(Workspace Management)、构造管理(Build Management)、过程控制(Process Control)。ClearCase通过TCP/IP来连接客户端和服务器。另外,ClearCase拥有的浮动License可以跨越UNIX和 Windows NT平台被共享。

    ClearCase的功能比CVS、SourceSafe强大得多,但是其用户量却远不如CVS、SourceSafe的多。主要原因是:ClearCase价格昂贵,如果没有批量折扣的话,每个License大约5000美元。对于中国用户而言,这无疑是天价。用户只有经过几天的培训后(费用同样很昂贵),才能正常使用ClearCase。如果不参加培训的话,用户基本上不可能无师自通。

    易用性:★★★

    ClearCase 的安装和维护远比 VSS 复杂,要成为一个合格的 ClearCase 的系统管理员,需要接收专门的培训。 ClearCase 提供命令行和图形界面的操作方式,但从 ClearCase 的图形界面不能实现命令行的所有功能。如果Unix/Linux服务器上安装了Samba服务,可以直接通过Windows下Clearcase的客户端直接访问源代码,相对比较简单。

    功能:★★★★★

    ClearCase 提供 VSS, SVN所支持的功能,但不提供变更管理的功能。 Rational 另提供了 ClearQuest 工具提供对变更管理的功能,与 VSS不同, ClearCase 后台的 数据库 是专有的结构。 ClearCase 对于 windows 和 unix 平台都提供支持。 ClearCase 通过多点复制支持多个服务器和多个点的可扩展性,并擅长设置复杂的开发过程。

    安全性:★★★★

    ClearCase 的权限设置功能与 SVN 相比, SVN 有独立的安全管理机制, ClearCase 没有专用的安全性管理机制,依赖于操作系统。

    总体成本:★★

    要选用 ClearCase ,需要考虑的费用除购买 license 的费用外,还有必不可少的技术服务费用,没有 Rational 公司的专门的技术服务,很难发挥出 ClearCase 的威力。如现在网上虽有 ClearCase 的破解软件,但尝试应用的公司大多失败的缘故。另外,对于 web 访问的支持,对于变更管理的支持功能都要另行购买相应的软件。

    技术支持:★★★★★

    Rational 公司已被 IBM 公司收购,所以有可靠的售后服务保证。


    四、总结

    工具对比一览表

    特性           VSS           SVN             ClearCase

    易用性         ★★★★      ★★★          ★★★

    功能           ★★★        ★★★★        ★★★★★

    安全性         ★★★        ★★★★        ★★★★

    总体成本       ★★★★      ★★            ★★★★★

    技术支持       ★★★★      ★★★          ★★★★★


    以上几种工具的总结如下: 

    1. VSS 的使用简便易学,但 VSS 的功能和安全性较弱,且只对 windows 平台进行支持,建议作为项目配置管理的入门时采用的工具;

    2. SVN 的安全性和版本管理功能较强,可以实现异地开发的支持,但 SVN 安装和使用多采用命令行方式,学习曲线高,同时不提供对变更管理的功能,对于小型团队,可以采用 SVN 进行管理。

    3. ClearCase 功能完善,安全性好,可以支持复杂的管理,但学习曲线和学习成本高,需要集成 ClearQuest 才能完成完整的配置管理功能。大公司如果采用异地多研发中心同时开发的模式,一般推荐使用ClearCase。
    展开全文
  • 常见的机器视觉工具(转载)

    千次阅读 2015-08-12 23:58:07
    机器视觉我们最常用的软件是OpenCV(Intel OpenSource Computer Vision Library),它的中文论坛http://www.opencv.org.cn/index.php里面非常清楚的介绍。 二、VisionPro®7.0系统,快速开发强大的应用系统 ...
  • 当前业界常见的服务器性能指标: TPC-C TPC-E TPC-H SPECjbb2005 SPECjEnterprise2010 SPECint2006 及 SPECint_rate_2006 SPECfp2006 及 SPECfp_rate_2006 SAP SD 2-Tier LINPACK RPE2 一、TPC ...
  • 商业智能工具有哪些? 商业智能也称作BI,是英文单词Business Intelligence的缩写。商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。这里所谈的数据包括来自企 业业务...
  • 如果还在质保期内,当然是 尽量找到销售商要求保修。但现在大多数 IDE 硬盘质保期只有一年,而大多数用户都希望一个硬盘能使用三年以上。如果质保期过后硬盘出了故障,就得考虑更换 或对它进行修理。   笔者...
  • 可视化工具软件排行榜

    千次阅读 2019-03-27 10:31:34
    市面上的数据可视化工具软件如此之多,有哪些可视化软件工具居于排行榜单的前列呢?你用的软件上榜了吗? 1、FineBI 来自帆软公司,虽作一个BI工具,但是可视化效果不错,可制作Dashboard。优势在于一旦准备好数据...
  • 销售经理应具备哪些技能

    千次阅读 2013-11-14 16:46:17
    销售经理应具备哪些技能 导 言   对一个合格的销售经理,只有知识是远远不够的,知识只是保证成功的必要条件。你还必须提升你的各项技能。这些技能是实践性很强的技能,远非读完本章就可以做到,但本章就...
  • ATMEL 的STK500(980 元/套)起步工具包是适用于开发Atmega103 芯片的对芯片的编程是通过在系统编程(ISP)接口完成的  仿真器 ... 问:有哪些支持AVR 的起步工具包  答STK100,SL-AVR,SL-OK
  • 常见问题,新手必看(不要再问如何更改日期了,进来看)  http://www.cocoachina.com/bbs/read.php?tid-8383.html  (推广知识) 销售数据 地区排名和销量的对应关系(免费、收费都)  ...
  • 沟通CTBS常见问题

    千次阅读 2015-02-02 17:00:50
    、浏览CTBS网站时,Service Unavailable或应用程序池自动停止的现象 解决方法: 点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM(配置)”选项,选择其下的“IIS ADMIN ...
  • 常见单片机芯片分析简介

    千次阅读 2011-10-21 11:18:01
    常见单片机芯片分析简介 HT:工具好用.DEMO难搞.成本中等. PIC:工具难用,DEMO易搞.成本偏高. FREESCALE:工具难用,DEMO易搞.成本偏高. STC/51:工具好用,DEMO易搞.成本偏低. AVR:工具好用,DEMO易搞.成本中等. ...
  • pandas 常见绘图总结

    万次阅读 多人点赞 2019-12-26 16:25:53
    pandas 常见绘图总结 文章目录pandas 常见绘图总结前言一 设置字体和显示中文二 pandas 可视化(0.25.3版本)1 线形图2 条形图2.1 ...pandas的强大让人毋庸置疑,一个集数据审阅、处理、分析、可视化于一身的工具,非...
  • 本文以日常工作过程中人人都在用的邮件为出发点,从工具辅助、改善习惯的角度看待个人工作效率与工具使用方式上的关联,试图找出使用邮件的最佳实践。主要从两大方面对这个问题进行展开:写邮件和管理邮件。结合团队...
  • 你应该知道的10种软件工具

    千次阅读 2015-04-08 09:51:02
    我觉得我应该分享一个能帮助我完成工作的软件工具列表。它们大多数都是免费的或者比较便宜的。它们大多数也和软件一起工作。如果你向来不需要设计,阅读或者编辑任何软件,那么你属于读了这篇文章不会从中受益的那一...
  • 最佳安全工具

    千次阅读 2015-04-20 14:31:20
    Insecure.Org 2006年度的安全工具调查。...我-Fyodor对nmap-hackers 邮件列表中的用户进行了调查,让大家来分享他们最喜欢用的工具,结 果3243名用户提供了反馈信息。我从反馈信息中选取了大家最喜欢
  • 香港电话 ...最常见问题,新手必看(不要再问如何更改日期了,进来看) http://www.cocoachina.com/bbs/read.php?tid-8383.html (推广知识) 销售数据 地区排名和销量的对应关系(免费、收费都) ...
  • 网络安全渗透高级工具(黑客工具软件大全100套)

    万次阅读 多人点赞 2019-05-25 00:33:55
    黑客工具软件大全100套 1 Nessus:最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上。它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance...
  • Android 手机自动化测试工具有哪几种? 3 条评论  分享 按投票排序按时间排序 28 个回答 78赞同 反对,不会显示你的姓名 知乎用户,...
  • 求职简历中一些常见的问题

    千次阅读 多人点赞 2017-05-19 17:59:22
    因此,建议求职者要用简单的语言来描述清楚自己所做过的项目,让面试官能够在很短的时间里知道你做了哪些工作。 问题三:自我评价很空洞 某位应聘者这样进行自我评价: 本人学习能力强,对新知识接受...
  • HDMI 常见问题

    千次阅读 2012-02-17 10:24:47
    HDMI 常见问题解答 目录: 一般 HDMI 问题 成为采纳者 HDMI 规范 HDMI 1.3 商标与徽标使用准则 兼容性测试 ...问:HDMI 相对于现有的模拟视频接口如复合、S-Video 和分量视频的优点有哪些? 问:通
  • 赚外快—常见编程接单的网站集合(20余个)

    万次阅读 多人点赞 2021-02-07 15:07:48
    ▍前言 ...如果你主业上遇到了瓶颈,平时的时间比较充分,想一些额外的收入,同时为了保持技术的熟练度,这种情况下,是可以考虑接一些私活的。对于那种投入时间巨大,回报很可怜的项目,千万不要接。.
  • 电子商务基础概论 项目六 网络营销 ELECTRONIC COMMERCE 目录...网络营销工具 常见网络营销工具 1企业官网网站 小米官方网站 企业官网网站可以实现网络品牌信息发布产品展示客户关系资源合作网络调研和网络销售八项功能

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,749
精华内容 14,699
关键字:

常见的销售工具有哪些