Talend中变量载入(tContextLoad)的用法,及其他注意事项

此文为本人私下参考用,不拘泥于表达

一、要用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

 

所以,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中填写: '.' 就行了。更多截图如下:

TALEND

 

然后是相对路径问题:比如在文件路径中直接写:"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的方法传递参数,这样写:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值