kettle设置了一个变量,执行第一次的时候提示出现不支持的sql92,然后再运行一次job变量就正常使用了

kettle设置了一个变量,执行第一次的时候提示出现不支持的sql92,然后再运行一次job变量就正常使用了,第1张

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 table output , 然后开始报错,报完错就到处找高手问,他们的数据库原理老师已经在吐血了。如果是三个表连接,一个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 在302GA版中将推出一种新功能,在一个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 步骤)都可以达到目的(基于上面的1,2 特性)

如果你的ETL *** 作比较的多线程性,同一时间可能需要多个表结构一样并且里面都是为空的表(基于上面1,2,3特性),你可以创建一个 “字符串+序列” 的模式,每次需要的时候,就创建这样的表,用完之后就删除,因为你自己不一定知道你需要多少个这种类型的表,所以删除会比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也有提到)

首先,配置环境变量。另外,如果你的机子上没有数据库驱动jar包的话,需要下载一个sqljdbc4jar。下面,右击“我的电脑”》》选择“属性”》》再选择“高级”》》选中“环境变量”。

在d出的对话框中,系统变量栏如果已经有了CLASSPATH系统变量(注意大写),那么在最后添上jar包的绝对路径(;d:\sqljdbc4jar),注意加上分隔符“;”。如果没有CLASSPATH,那么新建一个,如图中所示。。

其次,对SqlServer配置管理器进行设置。首先打开SqlServer配置管理器。具体步骤如图示。

进入SQL配置管理器后,选中左侧“SQL Server网络配置”》》再选中“MSSQLSERVER的协议”双击后,右侧窗口会有“TCP/IP”选项。双击进入。如图示。

在TCP/IP属性中对IP地址进行设置,IP地址设为“127001”,即本地ip。端口值在后面会用到,先记住。如图示。注意,TCP/IP若不是处于启动状态,要右击后选择“启动”。

进行完上述设置后,打开MyEclipse进入数据库 *** 作界面。打开后,依次选择“window”》》“open perspective”>>"other"进入对话框,选择“MyEclipse DataBase Explorer”后就进入了。如图示。

在右侧窗口空白区域右击鼠标,选择"New",打开数据库驱动对话框,具体 *** 作步骤见图所示。

对DatabaseDriver进行设置,“Driver template”中选择Sqlserver;“Driver name”可以随便取;“Connection URL”如图所示设置,注意,1433,即为上面提到的端口值。后面的“databaseName=bank”是Sql中已存在的一个数据库名。账号、密码一般是“sa”,然后,点击“Add JARs”把jar包导入。点击“finish”完成设置。

上述设置完成后,MyEclipse左侧窗口就会出现刚设置的“Driver name”即sqlserver,如图示。右击“sqlserver”,选择“open connection”,在d出的对话框中输入账号密码,就是上面的“sa”。点击“OK”就可以了,数据库连接成功了。效果如图示。

以sqlserver2008R2为例。

1、打开sql2008,使用windows身份登录

2、登录后,右键选择“属性”。左侧选择“安全性”,选中右侧的“SQL Server 和 Windows 身份验证模式”以启用混合登录模式

3、选择“连接”,勾选“允许远程连接此服务器”,然后点“确定”

4、展开“安全性”,“登录名”;“sa”,右键选择“属性”

5、左侧选择“常规”,右侧选择“SQL Server 身份验证”,并设置密码

6、右击数据库选择“方面”

7、在右侧的方面下拉框中选择“服务器配置”;将“RemoteAccessEnabled”属性设为“True”,点“确定”

8、至此SSMS已设置完毕,先退出,再用sa登录,成功即表示sa帐户已经启用

9、打开sql server配置管理器

10、下面开始配置SSCM,选中左侧的“SQL Server服务”,确保右侧的“SQL Server”以及“SQL Server Browser”正在运行

11、在左则选择sql server网络配置节点下的sqlexpress的协议,在右侧的TCP/IP默认是“否”,右键启用或者双击打开设置面板将其修改为“是”

12、选择“IP 地址”选项卡,设置TCP的端口为“1433”

13、将"客户端协议"的"TCP/IP"也修改为“Enabled”

配置完成,重新启动SQL Server 2008。此时应该可以使用了,但是还是要确认一下防火墙。打开防火墙设置。将SQLServrexe(C:\Program Files\Microsoft SQL Server\MSSQL10SQLEXPRESS\MSSQL\Binn\sqlservrexe)添加到允许的列表中。

需要在“开始”-“程序”里设置一下。

具体步骤:

1单击“开始”,依次指向“程序”、“Microsoft SQL Server2005”和“配置工具”,然后单击“SQL Server 外围应用配置器”。

2 在“SQL Server 2005 外围应用配置器”页上,单击“服务和连接的外围应用配置器”。

3 在“服务和连接的外围应用配置器”页上,展开“数据库引擎”。

4依次单击“远程连接”和“本地连接和远程连接”,单击适用于您的环境的相应协议,然后单击“应用”。

5在“服务和连接的外围应用配置器”页上,展开“数据库引擎”。

6依次单击“服务”和“停止”,等待 MSSQLSERVER 服务停止,然后单击“启动”以重新启动 MSSQLSERVER 服务。

无法连接到数据引擎的原因主要是你的服务没有开。右键单击我的电脑-----管理-----服务----找到sql的启动项(也可以是你自己的软件引擎),右键单击,选择-启动,等启动后,将你自己开的软件全部关掉,重新打开就可以了

1、打开sqlserver的企业管理器或者是SQL server Management Studio

2、服务器类型选择:数据库引擎

3、服务器名称输入:localhost或是本机ip

4、身份验证选择:如果没开混合验证,选windows身份验证;如果开了混合验证,可以用windows身份登录,也可选选择SQL server身份验证。

5、选了SQLserver身份认证需要输入SQL已经定义的用户名和密码。

以上就是关于kettle设置了一个变量,执行第一次的时候提示出现不支持的sql92,然后再运行一次job变量就正常使用了全部的内容,包括:kettle设置了一个变量,执行第一次的时候提示出现不支持的sql92,然后再运行一次job变量就正常使用了、sqlserver怎么连接数据库、如何连接sqlserver数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9481186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存