此文为本人私下参考用,不拘泥于表达
一、要用tContextLoad,就要:
举一个例子:
添加组件1、tFileInputDelimited。这个组件可以提取一个txt文件,行之间默认回车,您可以建一个a.txt,内容如下:
并且在下面的Schema中添加key和value两个字段。
2、添加组件 tContextLoad,把前者控件和此控件连接起来。这时一定要在运行前添加context变量,且2个变量名一定是:context.myname和context.sex才行。这时如果您选择上“打印操作”,就是发现相关信息了。
以上是对文本文件的context的使用说明,下面是从数据库中提取到context变量的方法:
1、放一个tOracleInput,其中此表要有2个字段,第一字段是key(即描述),第二个字段是value。注意,之前要在Contexts栏目添加tOracleInput中key里的变量。
如果如果表有多行也无妨,就像上面的那个文本文件一样,第一字段是key,第二个字段是value,当然您也可以把key和value的顺序颠倒。
2、放一个tContextLoad。
后来截图如下:
所以,talend的常用操作流程为:
tFileInputDelimited读出txt的内容 ---> tContextLoad写入全局变量(当然也可用自定义的静态变量代替全局变量)
---> 正常操作并以context变量为参考值 ---> 从数据库中提取需要写的文本文件的相关key和value
---> 用tFileOutputDelimited 写入到txt文件。这个text文件最终都是形如上面的txt列子。
二、日期的问题
由于Talend是由JAVA做的,日期被转为String后,就形如: 200-3-12 11:11:11.0 了。
所以下一步如果自定义select的where的话,就要用substring截取,如:
三、自定义schema内容
软件在用到关键的控件:tMap时,一般会抽取tOracleInput 中schema的全部字段,如果你想自定义字段,如:select max(shijian) from a ,那么你就需要点击一下: Guess Schema按钮;如果恰巧是时间类型,还需要选择date类型。
如果对tOracleOut不是插入,而是更新的话,就要在tMap中将更新表设置一个 键 。如果这个表只有一个列的话,还有设置另外一个列,作为常数,作为键。
四、交换戳 问题
一些人用本地服务器的时间戳来作为数据交换的戳,方法为记录上次交换的时间和本次交换的时间,然后下次交换时,条件会:大于本次记录的时间。问题在这里:你的服务器时间不可能和数据库服务器时间一秒不差。比如您服务器现在的时间是:9:00:00,数据库服务器时间是:8:59:58,按照上面的方法,你会记录这次最后的交换时间为9点整,但下次您在交换时,会遗漏数据库上的8:59:59秒。
所以,好的交换方法应为每次交换后,记录数据转入服务器上记录的max(时间),才对。下次大于这个时间。(其实,这个方法也有瑕疵,因为可能存在交换时最后一秒有多条记录,而您可能当时只转入了一条记录,所以会遗漏同一秒中的其他数据。当然,这种可能性比较小,但理论上存在,解决方法是:下次取的时候,不应大于,而是大于等于这次时间。但会带来一些效率问题,因为update的效率较低,而且因为是update,所以需要设置“键”)
这里我还有个问题需要考证,就是在取转入数据库上的最大时间戳时,不知是加上时间限制之后取max(时间),效率高,还是直接max(时间)效率高。
当然,我主张您还是以数字型主键作为 交换戳,这样就不会重复了。
五、本地文本文件问题
以下本节的内容,随着我对talend 的认识,发现用XML并不怎么好,感觉还不如用txt来的方便和直接。
我主张用XML来代替txt,talend也专门有一章来介绍如何操作XML。
XPath 建议列出了一些轴,这些轴包含了一些与当前选择节点(也称为上下文节点)相关的节点。为避免冗长,指定了某些常用轴的一些缩写。下表显示这些缩写和它们等效的轴。
缩写 | 轴 |
---|---|
. | self::node() |
.. | parent::node() |
// | /descendent-or-self::node()/ |
@ | attribute:: |
另一个事实是在每个位置步骤或路径表达式上使用的默认轴是 child:: 轴。因此,/bk:books/bk:book 实际等效于 /child::bk:book/child::bk:book, 这比直接键入要容易得多。
举个例子,我写了一个XML:
在talend的 循环XPath查询(Loop XPath Query)中就要写: /HELLO/ren 。
在 映射(Mapping Column/XPath query)中的XPath query中填写: '.' 就行了。更多截图如下:
然后是相对路径问题:比如在文件路径中直接写:"abc.xml",那在测试时,实际是在talend的安装目录下,而不是在具体项目下;之后导出作业脚步后,这个abc.xml并不会被导出,您需要在批处理的同文件夹下复制这个abc.xml。
六、三元表达式:
talend的MAP最终以java的形式存放,所以如果想在表达式中写java判断代码,我目前的方法是写三元表达式:
1、row1.abc > context.xy ? row1.abc : context.xy
七、流水号补齐:
String.format("%05d",++row2.id)
这样会把从表2传过来的id首先加1,然后如果不够5位的话,在前面补齐0。
以上的六、七,结合起来,如果想往另外一个表记录最大值,就可想而知了。
八、自定义函数
虽然我试图用匿名函数来给变量定义表达式(形如:String myfunction(){if.....;} ),但总是不成功,估计是不支持吧。
在talend工具左边,有一个“代码”,右键下面的“常规”,选择“创建事务”,就可以自定义函数了。
需要注意的是,上面的蓝色的注释也是必须的,特别是一个叫:cagtegory 的,它决定了您的函数是否能出现在用户自定义的函数工具栏中。
另外,如果您写:public static String xiao="hello"; 那么以后您就可以在任意位置写: along.xiao (along是您当时创建函数时写的 class 的名字),来代替context上下文变量了。
九、错误处理
如果在倒库过程中出现错误,就需要记录错误日志并报警。talend中有“logs&Errors”组件组,个人认为,对于我来讲,目前其中的tDie和tWarn没什么用,重要的是tLogCatcher和tAssertCatcher。他们之间没什么大区别,都有捕获java异常的作用,但前者的捕获的项目更多一点。其中看tLogCatcher的schema,需要知道:
moment:代表出现错误的时间
project:项目名称 job:项目中的具体作业。
type:错误类型,如果您只选择了JAVA错误,这个就一定是JAVA异常了。
origin:哪个组件出现了错误。如:tOracleInput_1。虽然你的项目中未必有这个名称(你改名了),但这是指talend系统内部记录的这个组件是第几次出现的那个组件,对于我怎么才能知道呢?只需点击某个组件,然后查看“Code”就知道了,这对于判断在哪里出现了错误,比较重要。
message:这个最重要,指错误内容
code:错误代码
最后,把以上错误内容写到另外一个数据库中,便于记录和报警。
十、其他小注意事项
1、java中的等于一般不是 == ,而是 字符.equals("dfdf")
2、对于可能会是null的方法传递参数,这样写: