dashDB 和 DB2 Load 操作

dashDB and DB2 Load operation

我目前正在尝试将 dashDB 数据库与 db2cli 实用程序和 ODBC 结合使用(值来自 Connect/Connection dashDB Web 控制台上的信息)。此时我可以完美地执行 SELECTINSERT 语句并从我创建的自定义表中获取数据,这要归功于命令:

db2cli execsql -connstring "DRIVER={IBM DB2 ODBC DRIVER - IBMDBCL1}; DATABASE=BLUDB; HOSTNAME=yp-dashdb-small-01-lon02.services.eu-gb.bluemix.net; PORT=50000; PROTOCOL=TCPIP; UID=xxxxxx; PWD=xxxxxx" -inputsql /tmp/input.sql

现在我正尝试通过 db2cli 实用程序执行 DB2 LOAD 操作,但我不知道如何继续,甚至不知道是否可以这样做。 目的是从文件中导入数据,而无需在我这边对 DB2 dashDB 数据库进行编目,而只能通过 ODBC。有人知道这种操作是否可行(使用 db2cli 或其他实用程序)吗?

您可以尝试使用 REST API 加载数据。

示例:

curl --user dashXXX:XXXXXX -H "Content-Type: multipart/form-data" -X POST -F loadFile1=@"/home/yogesh/Downloads/datasets/order_details_0.csv" "https://yp-dashdb-small-01-lon02.services.eu-gb.bluemix.net:8443/dashdb-api/load/local/del/dashXXX.ORDER_DETAILS?hasHeaderRow=true&timestampFormat=YYYY-MM-DD%20HH:MM:SS.U"

这是不可能的。 LOAD 不是 SQL 语句,因此它不能通过 ODBC 等 SQL 接口执行,只能使用 DB2 CLP,而这又需要编目数据库。

ADMIN_CMD() 可以通过SQL接口调用,但是,它要求输入文件在服务器上——它不会使用存储在您工作站上的文件。

如果 JDBC 是一个选项,您可以使用 CLPPlus IMPORT command

我使用过 REST API 并且没有看到任何大小限制。在 dashDB 的 1.11 版中,本地(仓库数据库)外部 tables 已被包含在内。只要文件在容器上,就可以加载它。此外,DB2 Load 会锁定 table 直到加载完成,而外部 table 加载不会

从 DB2 on Cloud(前 DashDB)仪表板引用的最新 API 版本可用 here。它首先需要调用 /auth/tokens 端点,以根据您的 Bluemix 凭据生成一个授权令牌,用于授权 API 调用。

我最近发布了一个 npm 模块 - db2-rest-client - 以简化这些操作的使用。例如,要从 .csv 文件加载数据,您可以使用以下命令:

# install the module globally
npm i db2-rest-client -g

# call the load job
export DB_USERID='<USERID>'
export DB_PASSWORD='<PASSWORD>'
export DB_URI='https://<HOSTNAME>/dbapi/v3'
export DEBUG=db2-rest-client:cli
db2-rest-client load --file=mydata.csv --table='MY_TABLE' --schema='MY_SCHEMA'

对于加载作业,在专用于 70MB 源文件和大约 400 万行的 Bluemix 上进行的测试加载了大约 4 分钟。还有其他 CLI 选项,如执行导出语句、逗号分隔语句和上传文件。

有多种方法可以将数据导入 Db2 Warehouse on Cloud。从命令行,您可以使用 Lift CLI https://lift.ng.bluemix.net/,它为大型数据集提供最佳性能

您还可以使用 EXTERNAL TABLEs https://www.ibm.com/support/knowledgecenter/ean/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r_create_ext_table.html,它们也是高性能的并且有很多选项

这是一个使用本地文件(不在服务器上)的快速示例,因此 REMOTESOURCE YES 选项

db2 "create table foo(i int)"
echo "1" > /tmp/foo.csv
db2 "insert into foo select * from external '/tmp/foo.csv' using (REMOTESOURCE YES)"
db2 "select * from foo"

I          
-----------
          1

1 record(s) selected.

对于大文件,您可以即时使用 gzip

db2 "insert into foo select * from external '/tmp/foo.csv' using (REMOTESOURCE GZIP)"

或来自 gzip 压缩文件

gzip /tmp/foo.csv
db2 "insert into foo select * from external '/tmp/foo2.csv.gz' using (REMOTESOURCE YES)"