1、简介: Ingest 应用工具是 DB2 Galileo 版本中新的概念 , 它是一个客户端工具。用户可以用 INGEST 来进行数据的导入 , 它有比 LOAD,IMPORT 更好的性能,本文介绍 Ingest Utility 支持的各种文件格式,并详细介绍 Ingest Utility SQL statement( insert, update, delete, merge,replace)的用法,并给出一实例进行分析。INGEST 是 DB2 Galileo( DB2 10 的开发代号) 的新特性 , 是为了有大量持续的数据流来实时和并发的快速进行数据导入而引入的新概念。本文将详细介绍了
2、 INGEST 支持的各种数据文件格式,以及所支持的insert, replace, update, delete, merge 的数据导入操作。-Ingest Utility 支持的各种文件格式介绍,用法和实例分析Ingest 工具支持两种数据格式:DELIMITED 和 POSITIONAL。语法如清单 1 所示。 选择用 DELIMITED 文件格式的时候后面跟着划分符,如果不指定,默认的是“,”,这点和 import 和 load 类似。如果选用的是 POSITIONAL 文件格式的数据时后面可跟数据记录的长度,这个长度是指每条记录每次截取的总长度,如果 RECORDLEN 指定的长度
3、小于各列的长度之和时就会报错并退出,如果大于各列的长度之和,ingest 工具将会 后一列 指定的长度之 的 。RECORDLEN 可指定的 是 1-32767。如果不指定 RECORDLEN 的长度, 默认是 符 行符作为每一条记录的 符。并 指定 field name 之后 可以 POSITION 指定每个 field 的 。清单 1:INGEST 支持的数据文件格式定 |-+-DELIMITED-+-+-+- | -BY-char- | -POSITIONAL-+-+- -RECORDLEN-length-field-definition |-$field-name-+-+- -POSI
4、TION-(-start-+-+-)- -:-end- 清单 2 是一个用 POSITIONAL 格式 有指定 RECORDLEN 数的例。 a.asc 文件中,每一行的 12 中不为, 17 19 有 符 。 为有 ingest 语中指定了 position 的 ,所以 ingest 工具currency1取 position 指定的 ,并不 “的 有 符。并 有指定 RECORDLEN 的长度,所以默认为 行符为一行的 。清单 2: POSITIONAL INGEST 示例数据文件 a.asc 的fifl2 2001 552010aaa 25 2002 452011bbb 143 2003
5、 2c2012ccc 1555 2004 3b2013ddd 1309 2005 7a2014eee 行 INGEST 语的 果INGEST FROM file format21_01.asc format POSITIONAL ( $field1 POSITION(1:4) int external, $field2 POSITION(6:9) DATE YYYY, $field3 POSITION(11:11) TIME H, $field4 POSITION(13:16) TIMESTAMP YYYY ) restart off insert into t1(perkey,periodd
6、ate, periodtime, periodts) values($field1,$field2,$field3,$field4) SQL2979I The ingest utility is starting at “08/08/2012 01:34:10.517287“. SQL2914I The ingest utility has started the following ingest job: “DB21001:20120808.013410.517287:00002:00004“. Number of rows read = 5 Number of rows inserted
7、= 5 Number of rows rejected = 0 SQL2980I The ingest utility completed successfully at timestamp “08/08/2012 01:34:16.322027“db2 = select * from t1 PERKEY PERIODDATE PERIODTIME PERIODTS - - - - 25 01/01/2002 04:00:00 2011-01-01-00.00.00.000000 1555 01/01/2004 03:00:00 2013-01-01-00.00.00.000000 143 0
8、1/01/2003 02:00:00 2012-01-01-00.00.00.000000 2 01/01/2001 05:00:00 2010-01-01-00.00.00.000000 1309 01/01/2005 07:00:00 2014-01-01-00.00.00.000000 5 record(s) selected. 清单 3 是一个指定了 RECORDLEN 的例。用例 1 中的文件 a.asc, 指定 RECORDLEN 长度为 20,这指定 20 是为 符了一个 ,Ingest 会以每次截取 20 个 符为一条记录的fifl。清单 3: RECORDLEN 示例db2
9、= INGEST FROM file a.asc format POSITIONAL RECORDLEN 20 ( $field1 POSITION(1:4) int external, $field2 POSITION(6:9) DATE YYYY, $field3 POSITION(11:11) TIME H, $field4 POSITION(13:16) TIMESTAMP YYYY ) restart off insert into t1(perkey,perioddate, periodtime, periodts) values($field1,$field2,$field3,$
10、field4) SQL2979I The ingest utility is starting at “08/08/2012 02:07:24.409826“. SQL2914I The ingest utility has started the following ingest job: “DB21001:20120808.020724.409826:00002:00004“. Number of rows read = 5 Number of rows inserted = 5 Number of rows rejected = 0 SQL2980I The ingest utility
11、 completed successfully at timestamp “08/08/2012 02:07:28.987315“db2 = select * from t1 PERKEY PERIODDATE PERIODTIME PERIODTS - - - - 1555 01/01/2004 03:00:00 2013-01-01-00.00.00.000000 25 01/01/2002 04:00:00 2011-01-01-00.00.00.000000 2 01/01/2001 05:00:00 2010-01-01-00.00.00.000000 1309 01/01/2005
12、 07:00:00 2014-01-01-00.00.00.000000 143 01/01/2003 02:00:00 2012-01-01-00.00.00.000000 -Ingest SQL statement 的特性介绍 INGEST INSERT,UPDATE,DELETE,REPLACE,MERGE 语之, 来介绍一 INGEST SQL 语的一”性。这”性于所有 INGEST SQL statement 用。1. 于 field-name: 以 符开($), 长度 符 fi为 2-129。 和 SQL 定 符一。 定 field name 的时候可以 符之后跟着一定 符,例如
13、$“My Field Name“。 的是 后面 insert 语引用量的时候一定和这定 的 。 和 DB2 定 的是一的。清单 4 是一个简单的例,例 中,“test”,“Test”和 test 是不 的, DB2 中,如果不用引号特“指定,会默认为 是 大 。 用 定符 引号指定时,就是 定符面的fifl。 的,于 Ingest 工具中的 field name 是如。清单 4: 列 “大小 示例db2 = create table test (“test“ int, test char, “Test“ smallint) DB20000I The SQL command completed
14、successfully. db2 = describe table test Column name schema Data type name Length Scale Nulls - - - - - - test SYSIBM INTEGER 4 0 Yes TEST SYSIBM CHARACTER 1 0 Yes Test SYSIBM SMALLINT 2 0 Yes 3 record(s) selected. db2 = INGEST FROM file c.del FORMAT DELIMITED ( $“test“ INTEGER EXTERNAL, $“TEST“ char
15、, $“Test“ smallint EXTERNAL ) restart off insert into test values($“test“,$“TEST“,$“Test“) SQL2979I The ingest utility is starting at “08/09/2012 04:54:37.919526“. SQL2914I The ingest utility has started the following ingest job: “DB21001:20120809.045437.919526:00002:00006“. Number of rows read = 2
16、Number of rows inserted = 2 Number of rows rejected = 0 SQL2980I The ingest utility completed successfully at timestamp “08/09/2012 04:54:42.530551“db2 = select * from test test TEST Test - - - 33 b 44 11 a 22 2 record(s) selected. 而清单 5 中,之所以会报错“$field2“ 有定 ,是为面定 的 $field2 默认为是大 的,而后面 insert 语中 指定小
17、 的 $field2。清单 5:列 “大小 示例db2 = INGEST FROM file c.del FORMAT DELIMITED ( $field1 INTEGER EXTERNAL, $field2 char, $field3 smallint EXTERNAL ) restart off insert into test values($“FIELD1“,$“field2“,$“field3“) SQL2921N Field “$field2“ is not defined. SQL2902I The ingest utility completed at timestamp “
18、08/09/2012 05:03:22.234715“. Number of errors: “1“. Number of warnings: “0“. 2. field 量定 的个数和实 INGEST SQL 语用 的量数可以不一 。 后 用 的量 用之定 。如清单 6 所示,field 量个数为 5, INGEST INSERT statement currency1用 了 中的两个。清单 6: field 个数 column 个数不一 示例INGEST FROM file format21_01.asc format POSITIONAL ( $field1 POSITION(1:4)
19、int external, $field2 POSITION(6:9) DATE YYYY, $field3 POSITION(11:11) TIME H, $field4 POSITION(13:16) TIMESTAMP YYYY ) restart off insert into t1(perioddate) values($field2) 3. 了 merge 操作currency1支持 table 和 view,insert,delete, update, replace 支持 table,view 和 nickname。4. delete, update 和 merge 操作可以指
20、定 “。默认 CS(cursor stability)。 CLI 中 量 DB2CLIINIPATH 来(默认文件为 default sqllib/cfg/db2cli.in), 这会 所有的 CLI 应 。5. 所有的 INEST SQL statement 语中 引用 $field 量。具 的应于各种操作如:1) insert 和 replace 的 VALUES 中 引用 $field 量。2) delete 和 update 的 WHERE 中 引用 $field 量, 有 WHERE 。3) merge 的 ON 中 引用 $field 量。6. 如果 的列是以 符($)开, ING
21、EST SQL 语中 用 引号 来,以和 fieldname “。( 详 清单 9 中的示例 )7. field 量 Casting SQL data type 例如清单 7 中,如果 registry 量 DB2_DEFERRED_PREPARE_SEMANTICS=NO。 将会 错:SQL0245N “The invocation of routine DAY is ambiguous“为 DB2 不能定用 day 数的 个版本。 定 field 时 指定了它是 DATE 数据类型。时可以 语 这:INSERT INTO my_table(int_col) VALUES( day(CAST
22、($date_fld AS DATE) )清单 7INGEST FROM FILE my_file.txt FORMAT DELIMITED ( $date_fld DATE ) INSERT INTO my_table(int_col) VALUES(day($date_fld); -页首Ingest Utility insert, update, delete, merge, replace 操作介绍,用法和实例分析Ingest load 和 import 比多了 update, delete, merge 操作,这 ingest 工具能给用户提供更多更方的操作。面分“介绍 ingest
23、工具中 insert ,replace ,delete, update, merge 的用方法并举例 明。Insert 操作用法ingest 的 insert 语比 import 和 load 丰富一。支持向 table, view, nickname 中插入数据,支持 expression, null 和 default 值。需 的几点:1 SQL 中的 insert 一 column-name 和 values 后面的列数 。2 SQL INSERT 一,如果向 的所有列插入值时( 开 中有列 定 为 IMPLICITLY HIDDEN),可以不用列出所有的列。3 仅 field 量的数量
24、和指定的 是隐藏的 的列数一 的时候,(所有的 的列 有定 为 IMPLICITY HIDDEN)可以省 VALUES 。4 更特殊的情况,如果向 的所有列插入数值,并 插入所有列应于定 的 field 个数 时,时列和 VALUES 可以省 (如清单 8)。清单 8: insert 示例db2 = create table insert(a int, b char(5), c double); =cat a.del 1,b, 201 2,abc,202.2 INGEST FROM FILE my_file.txt FORMAT DELIMITED ( $field1 INTEGER EXTE
25、RNAL, $field2 char(5), $field3 double EXTERNAL ) INSERT INTO insert; Replace 操作用法ingest 的 insert 语比 import 和 load 丰富一。支持向 table, view, nickname 中插入数据,支持 expression, null 和 default 值。Replace 操作的语法和 Insert 操作的语法一,不 的地方是 replace 会 插入数据之用 delete 中的所有数据记录删掉。如果 很大的话,delete 会需一时 并 会用一日志 。清单 9 是一个 的列以($)符开的
26、例。 INGEST REPLACE statement 中用 引号(“”)标记。清单 9:replace 示例db2 = CREATE TABLE t1( empid int not null, dept int not null with default 23, salary dec(9,2), name varchar(21), firstname varchar(10), lastname varchar(10), address varchar(60), jointime date, edlevel int with default 15, $bonus char, “$bonus“
27、dec(9,2), job varchar(10) ); INGEST FROM file c.del FORMAT DELIMITED FORMAT DELIMITED ( $field1 dec EXTERNAL, $field2 INTEGER EXTERNAL, $field3 CHAR(20), $field4 CHAR(1) ) replace into t1 (“$BONUS“,“$bonus“) values($field4, $field1) Delete 操作用法Delete 操作 加条件语 WHERE-search-condition,并 search-condition
28、 不能为。这能控制不会 整个 给删 ,如果删 整个 可以直接用 delete 语,而不是 ingest 的 delete 语。 时 where 条件语中 含 ingest 语中定 的 $field 量。如:where 条件语仅为:where 1=1 where col1=1 是不支持的。Ingest 语中不 分大小 ,如:where col1=$field1 and COL2=$filed2 这是可以的。Delete 语支持丰富的 where 条件,可以有多个 and 和 or 语的组合。清单 10 中 where 中用 了一比较复杂的 search condition.清单 10:delet
29、e 示例INGEST FROM c.del FORMAT DELIMITED ( $field1 INTEGER EXTERNAL, $field2 INTEGER EXTERNAL, $field3 INTEGER EXTERNAL, $field4 INTEGER EXTERNAL, $field5 INTEGER EXTERNAL, $field6 INTEGER EXTERNAL ) DELETE FROM t1 where empid=$field1 and dept source_table.c1 WHEN NOT MATCHED then INSERT VALUES(source
30、_table.c1, source_table.c2); INGEST 令(用应的 MERGE 语)是:INGEST FROM FILE source_table.del FORMAT DELIMITED ( $c1 INTEGER EXTERNAL, $c2 CHAR(32) ) MERGE INTO target_table ON c1 $c1 这个条件满足,所以二条记录将不会再 插入了。值 的是,上面的例并不是一个 INGEST MERGE 的常 用情况。比如 MERGE 语 基于匹配一 的时候,并 有更多的 updating 和 inserting 操作的场景。SQL MERGE 和 INGEST MERGE 产生的 果是 的。