【问题标题】:How do I load a CSV file into a Db2 Event Store remotely using a Db2 client?如何使用 Db2 客户端将 CSV 文件远程加载到 Db2 事件存储中?
【发布时间】:2019-09-18 13:23:12
【问题描述】:

我在 Db2 Event Store 的文档中看到,当文件位于本文档 https://www.ibm.com/support/knowledgecenter/en/SSGNPV_2.0.0/local/loadcsv.html 的系统中时,可以将 CSV 文件加载到系统中。我还发现您可以使用How do I connect to an IBM Db2 Event Store instance from a remote Db2 instance? 中的标准 Db2 客户端连接到 Db2 Event Store 数据库。我现在要做的是使用该连接加载一个 CSV 文件。可以远程加载吗?

【问题讨论】:

    标签: csv file-upload db2 ibm-event-store


    【解决方案1】:

    这应该可以使用指定的额外关键字REMOTESOURCE YES 来实现,例如:

    db2 "INSERT INTO import_test SELECT * FROM EXTERNAL '/home/db2v111/data.del' USING (DELIMITER ',' REMOTESOURCE YES)"
    

    在此处查看示例: IMPORT script on IBM DB2 Cloud using RUN SQL Interface

    【讨论】:

    • 您还需要指定 csv 文件的代码页,例如如果文件是 UTF-8,则选项 CCSID 1208
    【解决方案2】:

    其他答案提到了使用传统db2的连接和加载。我必须添加一些专门针对 Db2 Event Store 所需的详细信息。

    假设我们使用的是 Db2 Client 容器,该容器可以在 docker hub 上找到,标签为 ibmcom/db2。 基本上我们要经过以下步骤:

    1/ 建立从 db2 客户端容器到远程 db2 eventstore 数据库的远程连接

    2/ 使用 db2 CLP 命令使用 db2 的外部表加载功能加载 csv 文件,这会将 csv 文件从 db2 客户端容器加载到远程事件存储数据库。

    第 1 步: 运行以下命令,或在脚本中运行它。请注意,这些命令需要在 db2 客户端容器中以 db2 用户身份运行。 db2 用户名通常为db2inst1

    #!/bin/bash -x
    NODE_NAME=eventstore
    . /database/config/db2inst1/sqllib/db2profile
    
    ### create new keydb used for authentication
    # remote old keydb files
    rm -rf $HOME/mydbclient.kdb  $HOME/mydbclient.sth $HOME/mydbclient.crl $HOME/mydbclient.rdb
    $HOME/sqllib/gskit/bin/gsk8capicmd_64 -keydb -create -db $HOME/mydbclient.kdb -pw ${SSL_KEY_DATABASE_PASSWORD} -stash
    KEYDB_PATH=/var/lib/eventstore/clientkeystore
    
    # get the target eventstore cluster's SSL public certificate using REST api
    bearerToken=`curl --silent -k -X GET "https://$IP/v1/preauth/validateAuth" -u $EVENT_USER:$EVENT_PASSWORD | python -c "import sys, json; print (json.load(sys.stdin)['accessToken']) "`
    
    curl --silent -k -X GET -H "authorization: Bearer $bearerToken"  "https://${IP}:443/com/ibm/event/api/v1/oltp/certificate" -o $HOME/server-certificate.cert 
    
    # insert eventstore cluster's SSL public cert into new gskit keydb
    $HOME/sqllib/gskit/bin/gsk8capicmd_64 -cert -add -db $HOME/mydbclient.kdb  -pw ${SSL_KEY_DATABASE_PASSWORD}  -label server -file $HOME/server-certificate.cert -format ascii -fips
    
    # let db2 client use the new keydb 
    $HOME/sqllib/bin/db2 update dbm cfg using SSL_CLNT_KEYDB $HOME/mydbclient.kdb SSL_CLNT_STASH $HOME/mydbclient.sth
    
    # configure connection from db2Client to remote EventStore cluster.
    $HOME/sqllib/bin/db2 UNCATALOG NODE ${NODE_NAME}
    $HOME/sqllib/bin/db2 CATALOG TCPIP NODE ${NODE_NAME} REMOTE ${IP} SERVER ${DB2_CLIENT_PORT_ON_EVENTSTORE_SERVER} SECURITY SSL
    $HOME/sqllib/bin/db2 UNCATALOG DATABASE ${EVENTSTORE_DATABASE}
    $HOME/sqllib/bin/db2 CATALOG DATABASE ${EVENTSTORE_DATABASE} AT NODE ${NODE_NAME} AUTHENTICATION GSSPLUGIN
    $HOME/sqllib/bin/db2 terminate
    
    # Ensure to use correct database name, eventstore user credential in remote 
    # eventstore cluster
    $HOME/sqllib/bin/db2 CONNECT TO ${EVENTSTORE_DATABASE} USER ${EVENT_USER} USING ${EVENT_PASSWORD}
    

    一些重要的变量: EVENTSTORE_DATABASE:远程事件存储集群中的数据库名称

    EVENT_USER:EventStore用户名远程eventstore集群

    EVENT_PASSWORD:EventStore 用户密码远程 eventstore 集群

    IP:远程事件存储集群的公共 IP

    DB2_CLIENT_PORT_ON_EVENTSTORE_SERVER:远程事件存储集群的 JDBC 端口,通常为 18730

    SSL_KEY_DATABASE_PASSWORD:db2客户端容器中gskit keydb文件的keystore密码,可以随意设置

    运行上述命令后,您应该已经建立了本地 db2 客户端容器和远程 eventstore 集群之间的连接

    2/ 使用 db2 的外部表功能加载 csv 文件

    db2 客户端和远程 eventstore 集群建立连接后,我们可以像向任何本地 db2 数据库发出命令一样发出 db2 CLP 命令。

    例如:

        // establish remote connection to eventstore database
        // replace the same variables in ${} with what you used above.
        CONNECT TO ${EVENTSTORE_DATABASE} USER ${EVENT_USER} USING ${EVENT_PASSWORD}
        SET CURRENT ISOLATION UR
    
        // create table in the remote eventstore database
        CREATE TABLE db2cli_csvload (DEVICEID INTEGER NOT NULL, SENSORID INTEGER NOT NULL, TS BIGINT NOT NULL, AMBIENT_TEMP DOUBLE NOT NULL, POWER DOUBLE NOT NULL, TEMPERATURE DOUBLE NOT NULL, CONSTRAINT "TEST1INDEX" PRIMARY KEY(DEVICEID, SENSORID, TS) INCLUDE (TEMPERATURE)) DISTRIBUTE BY HASH (DEVICEID, SENSORID) ORGANIZE BY COLUMN STORED AS PARQUET
    
        // external table load to remote eventstore database
        INSERT INTO db2cli_csvload SELECT * FROM EXTERNAL '${DB_HOME_IN_CONTAINER}/${CSV_FILE}' LIKE db2cli_csvload USING (delimiter ',' MAXERRORS 10 SOCKETBUFSIZE 30000 REMOTESOURCE 'YES' LOGDIR '/database/logs' )
    
        CONNECT RESET
        TERMINATE
    
    

    有关更多信息,您可以查看 Db2 EventStore 的公共 github 存储库。 https://github.com/IBMProjectEventStore/db2eventstore-IoT-Analytics/tree/master/db2client_remote/utils

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多