﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-robbie-随笔分类-Kettle</title><link>http://www.blogjava.net/robbie/category/36465.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 15 Dec 2008 21:48:22 GMT</lastBuildDate><pubDate>Mon, 15 Dec 2008 21:48:22 GMT</pubDate><ttl>60</ttl><item><title>随笔</title><link>http://www.blogjava.net/robbie/archive/2008/12/14/246274.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Sun, 14 Dec 2008 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/14/246274.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/246274.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/14/246274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/246274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/246274.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 这个星期的后半周主要搞了kettle的试验，做了两个例子出来，在后续工作中这两个例子应该也能派上用场，本来以为kettle的文档不多，后来单独下载了kettle的doc压缩包，发觉里面的内容还是不少的，真要将kettle搞熟的话，这些文档还是需要仔细研读一番的。另外kettle doc解压后文档目录挺奇怪的，都是数字命名的目录名，不知有啥具体含义。</p> <p>&nbsp;&nbsp;&nbsp; 下周的学习重点还是要转回到JBoss Seam中了 :-)</p><img src ="http://www.blogjava.net/robbie/aggbug/246274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-14 22:13 <a href="http://www.blogjava.net/robbie/archive/2008/12/14/246274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Kettle的第二个实践--数据获取并转换</title><link>http://www.blogjava.net/robbie/archive/2008/12/14/246271.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Sun, 14 Dec 2008 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/14/246271.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/246271.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/14/246271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/246271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/246271.html</trackback:ping><description><![CDATA[<p><strong><font color="#0080c0" size="4">需求：</font></strong></p> <p><font color="#800080">kettletest1数据库中有table_source数据表，结构如下：</font></p> <ol> <li>Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主键  <li>t_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据时间  <li>part_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例ID  <li>yg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据字段1  <li>wg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据字段2 </li></ol> <p>该表中的数据对于不同的实例ID，一分钟一条数据，t_id字段表示数据的时间，精确到分钟。</p> <p><font color="#800080"> kettletest2数据库中有table_target数据表，结构如下：</font></p> <ol> <li>Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主键  <li>marketdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据日期，格式为 yyyy-MM-dd  <li>pointtime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间，格式为 HH:mm  <li>pointnumber&nbsp;&nbsp; 时间的数字表示，00:01表示为1，00:00表示为1440  <li>plantcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例Code  <li>yg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据字段1  <li>wg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据字段2 </li></ol> <p><font color="#800080">需定期将table_source表中的数据获取至table_target表中，并进行如下处理：</font></p> <blockquote> <p>1、将t_id数据时间字段拆分为三个字段，分别为marketdate、pointtime、pointnumber。 </p></blockquote> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a、marketdate取t_id的日期部分。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b、pointtime取t_id的时间部分。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c、pointnumber为时间的数字表示，等于hour*60+minute。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d、但当t_id的时间为某日的00:00时，需将其转化为24:00，并且marketdate需取日期的前一天。如t_id为2008-12-04 00:00，则marketdate为2008-12-03，pointtime为24:00，pointnumber为1440。 </p></blockquote> <blockquote> <p>2、将part_id字段映射为plantcode字段，并根据如下规则进行转换： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; part_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plantcode <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3206&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P01 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3207&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P02 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3208&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P03 </p></blockquote> <p>测试中使用的数据库均为mysql数据库。</p> <p><strong><font color="#0080c0" size="4">实战：</font></strong></p> <p>整个转换工作共分为三个步骤，如下图：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/job.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 50px; border-right-width: 0px" height="144" alt="job" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/job_thumb.jpg" width="454" border="0"></a></p> <blockquote> <p>1、定义需获取的数据的日期</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans1.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 50px; border-right-width: 0px" height="450" alt="trans1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans1_thumb.jpg" width="600" border="0"></a> </p> <blockquote> <p>2、删除table_target表中已有数据，<font color="#ff0000"><strong>注意一定要将“执行SQl语句”面板中的“变量替换”要选上</strong></font>，否则SQL语句中的变量不会被替换，我刚开始没注意到这个地方，找问题找了半天。</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 50px; border-right-width: 0px" height="571" alt="trans2" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans2_thumb.jpg" width="500" border="0"></a> </p> <blockquote> <p>3、获取table_source中的数据，并将其插入table_target表</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3_1.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 50px; border-right-width: 0px" height="272" alt="trans3" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3_thumb_1.jpg" width="364" border="0"></a> </p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-1、获取table_source表的数据</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-1.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 80px; border-right-width: 0px" height="356" alt="trans3-1" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-1_thumb.jpg" width="450" border="0"></a> </p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-2、值映射</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 80px; border-right-width: 0px" height="299" alt="trans3-2" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-2_thumb.jpg" width="400" border="0"></a> </p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-3、字段选择</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-3.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 80px; border-right-width: 0px" height="292" alt="trans3-3" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-3_thumb.jpg" width="400" border="0"></a> </p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-4、对t_id字段进行处理，增加了pointnumber字段。<font color="#ff0000"><strong>在这一步骤中发现kettle的一个bug，就是不能在JavaScript中使用str2date函数，</strong></font>错误的具体信息参见：<a title="http://jira.pentaho.com/browse/PDI-1827" href="http://jira.pentaho.com/browse/PDI-1827">http://jira.pentaho.com/browse/PDI-1827</a>。这个问题也折腾了好长时间，刚开始怎么也想不通这个函数使用时怎么会报错呢，后来只好从字符串中截取年、月、日信息。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000"><strong> 该步骤中还存在另外一个使人困惑的问题，就是点击“测试脚本”按钮，会报错，但是执行job和transformation时则不会报错。</strong></font></p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-4_1.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 80px; border-right-width: 0px" height="360" alt="trans3-4" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-4_thumb_1.jpg" width="450" border="0"></a> </p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-5、增加pointnumber字段至输出结果中</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-5.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 80px; border-right-width: 0px" height="292" alt="trans3-5" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-5_thumb.jpg" width="400" border="0"></a> </p> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3-6、插入数据至table_target表</p></blockquote> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-6.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 80px; border-right-width: 0px" height="429" alt="trans3-6" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Kettle_1268F/trans3-6_thumb.jpg" width="400" border="0"></a> </p> <p>&nbsp;</p> <p>3-4步骤中的JavaScript代码如下：</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">var</span><span style="color: #000000"> pointTimeStr </span><span style="color: #000000">=</span><span style="color: #000000"> pointtime.getString();<br></span><span style="color: #0000ff">var</span><span style="color: #000000"> pointnumber </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br><br></span><span style="color: #0000ff">if</span><span style="color: #000000"> (pointTimeStr </span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">00:00</span><span style="color: #000000">"</span><span style="color: #000000">) {<br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> marketDateStr </span><span style="color: #000000">=</span><span style="color: #000000"> marketdate.getString();<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> marketDateYear </span><span style="color: #000000">=</span><span style="color: #000000"> substr(marketDateStr, </span><span style="color: #000000">0</span><span style="color: #000000">, </span><span style="color: #000000">4</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> marketDateMonth </span><span style="color: #000000">=</span><span style="color: #000000"> str2num(substr(marketDateStr, </span><span style="color: #000000">5</span><span style="color: #000000">, </span><span style="color: #000000">2</span><span style="color: #000000">))</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> marketDateDay </span><span style="color: #000000">=</span><span style="color: #000000"> substr(marketDateStr, </span><span style="color: #000000">8</span><span style="color: #000000">, </span><span style="color: #000000">2</span><span style="color: #000000">);<br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> date </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> Date();<br>&nbsp;&nbsp;&nbsp; date.setYear(marketDateYear);<br>&nbsp;&nbsp;&nbsp; date.setMonth(marketDateMonth);<br>&nbsp;&nbsp;&nbsp; date.setDate(marketDateDay);<br></span><span style="color: #000000"><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> temp1 </span><span style="color: #000000">=</span><span style="color: #000000"> dateAdd(date, </span><span style="color: #000000">"</span><span style="color: #000000">d</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp; marketdate.setValue(date2str(temp1, </span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd</span><span style="color: #000000">"</span><span style="color: #000000">));<br>&nbsp;&nbsp;&nbsp; pointtime.setValue(</span><span style="color: #000000">"</span><span style="color: #000000">24:00</span><span style="color: #000000">"</span><span style="color: #000000">);<br><br>&nbsp;&nbsp;&nbsp; pointnumber </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1440</span><span style="color: #000000">;<br>} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> hourStr </span><span style="color: #000000">=</span><span style="color: #000000"> pointTimeStr.substr(</span><span style="color: #000000">0</span><span style="color: #000000">, </span><span style="color: #000000">2</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> hour </span><span style="color: #000000">=</span><span style="color: #000000"> str2num(hourStr);<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> minuteStr </span><span style="color: #000000">=</span><span style="color: #000000"> pointTimeStr.substr(</span><span style="color: #000000">3</span><span style="color: #000000">, </span><span style="color: #000000">5</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">var</span><span style="color: #000000"> minute </span><span style="color: #000000">=</span><span style="color: #000000"> str2num(minuteStr);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; pointnumber </span><span style="color: #000000">=</span><span style="color: #000000"> hour </span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">60</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"> minute;<br>}</span></div> <p>&nbsp;</p> <p>至此，整个转换工作完成，小结一下：</p> <p>&nbsp;&nbsp;&nbsp; 如果对kettle等etl工具比较熟悉的话，使用etl工具进行数据转换、抽取等事情还是比较方便的，比起写程序还是有优势的。但是这个转换过程中遇到的kettle的两个bug比较让人头疼，觉得kettle好像还不是很稳定。</p><img src ="http://www.blogjava.net/robbie/aggbug/246271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-14 21:55 <a href="http://www.blogjava.net/robbie/archive/2008/12/14/246271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Kettle的第一个实践--从FTP上取文件，再放至另一个FTP上</title><link>http://www.blogjava.net/robbie/archive/2008/12/12/245962.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Fri, 12 Dec 2008 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/12/245962.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/245962.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/12/245962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/245962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/245962.html</trackback:ping><description><![CDATA[<p>这个实践其实不难，主要是有一个地方要注意，就是文件名通配符的写法，如果文件名格式为“TRANS_yyyymmdd.txt”，如TRANS_20081101.txt。如果想匹配所有以TRANS开头的文本文件，在kettle中要写成这样：TRANS_.*[0-9].txt。</p> <p>最后在windows操作系统中配置定时任务就可以定期执行该Job了。</p> <p>Job的图：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/KettleFTPFTP_D725/total.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="208" alt="total" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/KettleFTPFTP_D725/total_thumb.jpg" width="460" border="0"></a> </p> <p>FTP配置信息：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/KettleFTPFTP_D725/get%20ftp%20config.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" alt="get ftp config" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/KettleFTPFTP_D725/get%20ftp%20config_thumb.jpg" width="389" border="0"></a> <a href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/KettleFTPFTP_D725/put%20ftp%20config.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" alt="put ftp config" src="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/KettleFTPFTP_D725/put%20ftp%20config_thumb.jpg" width="453" border="0"></a></p><img src ="http://www.blogjava.net/robbie/aggbug/245962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-12 15:20 <a href="http://www.blogjava.net/robbie/archive/2008/12/12/245962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Kettle初探</title><link>http://www.blogjava.net/robbie/archive/2008/12/04/244464.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Thu, 04 Dec 2008 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/04/244464.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/244464.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/04/244464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/244464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/244464.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天早上在网上看到了kettle发布了最新的版本，忽然想起最近其实做了不少工作应该是ETL工具的拿手好戏，赶紧下载下来看看，看是否能够在实际的工作中应用起来。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺便讲一下，为啥看到kettle会两眼发光。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近写了好几个小程序，用于从一个ftp去获取数据，然后转发至另一个ftp去，或者是从一个数据库获取数据然后保存至本地的数据库中，使用的是jdk中的Timer实现的定时调度，本来也没什么问题，连续运行几个月都不会出错。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可是最近网络不是太好，周期性抽风，ping包时，每5分钟大概会丢7-8个包，从而导致程序也会假死，过一段时间后就不正常干活了，估计是因为用了数据库连接池的问题，要是每次发起数据库连接可能就不会有问题了，偷懒也不想改了，因为网络最终肯定是会修好的 :-) 但是想试试ETL工具，因为后面还有一些类似的东西要处理，不想写代码了，用别人的轮子感觉比较好，呵呵</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先下载了kettle的最新版，kettle3.1，解压后即可运行，一般的开发人员稍微摸索一下，看看例子简单的转换还是会做的，今天小试了一把，有几个注意点记下来。</p>
<ol>
    <li>使用资源库（repository）登录时，默认的用户名和密码是admin/admin</li>
    <li>当job是存放在资源库（一般资源库都使用数据库）中时，使用Kitchen.bat执行job时，需使用如下的命令行：<font color="#0080c0"><br />
    </font><font color="#0080c0">Kitchen.bat /rep kettle /user admin /pass admin /job job名</font></li>
    <li>当job没有存放在资源库而存放在文件系统时，使用Kitchen.bat执行job时，需使用如下的命令行：<font color="#0080c0"><br />
    Kitchen.bat /norep /file user-transfer-job.kjb</font></li>
    <li>可以使用命令行执行job后，就可以使用windows或linux的任务调度来定时执行任务了</li>
</ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一开始使用命令行方式执行job时，总是报如下的错误，琢磨了好长时间总算整明白正确的方式了。</p>
<blockquote>
<p><font color="#ff8040">Unexpected error during transformation metadata load <br />
No repository defined!</font></p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下一步准备按照实际情况定制Job，做好了再写小结。</p>
<img src ="http://www.blogjava.net/robbie/aggbug/244464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-04 22:48 <a href="http://www.blogjava.net/robbie/archive/2008/12/04/244464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>