ingest 应用工具是 db2 galileo 版本中新的概念 , 它是一个客户端工具。用户可以用 ingest 来进行数据的导入 , 它有比 load,import 更好的性能,本文介绍 ingest utility 支持的各种文件格式,并详细介绍 ingest utility sql statement( insert, update, del
ingest 是 db2 galileo( db2 10 的开发代号) 的新特性 , 是为了有大量持续的数据流来实时和并发的快速进行数据导入而引入的新概念。本文将详细介绍了 ingest 支持的各种数据文件格式,以及所支持的 insert, replace, update, delete, merge 的数据导入操作。
ingest utility 支持的各种文件格式介绍,用法和实例分析
ingest 工具支持两种数据格式:delimited 和 positional。语法如清单 1 所示。 选择用 delimited 文件格式的时候后面跟着划分符,如果不指定,默认的是“,”,这点和 import 和 load 类似。
如果选用的是 positional 文件格式的数据时后面可跟数据记录的长度,这个长度是指每条记录每次截取的总长度,如果 recordlen 指定的长度小于各列的长度之和时就会报错并退出,如果大于各列的长度之和,ingest 工具将会忽略最后一列结尾到指定的长度之间的字节。recordlen 可指定的范围是 1-32767。如果不指定 recordlen 的长度,则默认是回车符或者回车换行符作为每一条记录的结束符。并且在指定 field name 之后还可以通过 position 关键字指定每个 field 的起始位置。
清单 1:ingest 支持的数据文件格式定义
|--+-delimited--+----------+-----------+------------------------> | '-by--char-' | '-positional--+-------------------+-' '-recordlen--length-' field-definition |--$field-name--+-----------------------------------+-----------> '-position--(--start--+--------+--)-' '-:--end-'
清单 2 是一个用 positional 格式但没有指定 recordlen 参数的例子。 在 a.asc 文件中,每一行的第 12 位中不为空,第 17 到 19 位也有字符存在。但因为有 ingest 语句中指定了 position 的起始位置,所以 ingest 工具只取 position 指定的起始位置,并不关心别的位置有无字符。并且此处没有指定 recordlen 的长度,所以默认为回车换行符为一行的结束位置。
清单 2: positional ingest 示例
数据文件 a.asc 的内容 2 2001 552010aaa 25 2002 452011bbb 143 2003 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,perioddate, 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 = 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 01/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.