如何使用BTEQ导入从分隔文件中将数据导入teradata表?

时间:2014-05-21 07:23:14

标签: import teradata

我正在尝试在linux环境中执行以下bteq命令,但无法将数据正确加载到Teradata DB服务器中。有人可以建议我解决我在装载时遇到的以下问题。

使用BTEQ命令:

.SET width 64000;
.SET session transaction btet;
.logmech ldap
.logon XXXXXXX/XXXXXXXX,********;

DATABASE corecm;

.PACK 1000
.IMPORT VARTEXT '~' FILE=/v/global/user/application_event_bus_evt
.REPEAT *
USING(APPLICATION_EVENT_ID CHAR(24),BUS_EVT_ID CHAR(24),BUS_EVT_VID BIGINT,BUS_EVT_RESTATE_IN SMALLINT)

insert into corecm.application_event_bus_evt (APPLICATION_EVENT_ID
, BUS_EVT_ID
, BUS_EVT_VID
, BUS_EVT_RESTATE_IN
)
values
( COALESCE(:APPLICATION_EVENT_ID,1)
, COALESCE(:BUS_EVT_ID,1)
, COALESCE(:BUS_EVT_VID,1)
, COALESCE(:BUS_EVT_RESTATE_IN,1)
) ;
.LOGOFF;
.EXIT;

SAMPLE INPUT FILE DELIMITTER“〜”[/ v / global / user / application_event_bus_evt]:

Ckn3gMxLEeOgIQBQVgErYA==~g+GDDtlaY3n7BdUrYshDFA==~1~1
CL1kEcxLEeOgIQBQVgErYA==~qoKoiuGDbClpcGt/z6RKGw==~1~1
oYIVcMxKEeOgIQBQVgErYA==~mfmQiwl7yAteevzJfilMvA==~1~1
5N7ME5bM4xGhM7exj3ykUw==~yFM2FZbM4xGhM7exj3ykUw==~1~0
JLBH4JfM4xGDH9s5+Ds/8w==~doZ/7pfM4xGDH9s5+Ds/8w==~1~0
fGvpoMxKEeOgIQBQVgErYA==~mQUQIK2mY6WIPcszfp5BTQ==~1~1

表定义:

CREATE MULTISET TABLE CORECM.APPLICATION_EVENT_BUS_EVT ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      APPLICATION_EVENT_ID CHAR(26) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      BUS_EVT_ID CHAR(26) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      BUS_EVT_VID BIGINT NOT NULL,
      BUS_EVT_RESTATE_IN SMALLINT)
UNIQUE PRIMARY INDEX ( APPLICATION_EVENT_ID ,BUS_EVT_ID ,BUS_EVT_VID )
INDEX APPLICATION_EVENT_BUS_EVT_IDX1 ( APPLICATION_EVENT_ID )
INDEX APPLICATION_EVENT_BUS_EVT_IDX2 ( BUS_EVT_ID ,BUS_EVT_VID );

在DB服务器中设置的结果为,

    APPLICATION_EVENT_ID        BUS_EVT_ID                  BUS_EVT_VID             BUS_EVT_RESTATE_IN 

1    Ckn3gMxLEeOgIQBQVgErYA     == g+GDDtlaY3n7BdUrYshD     85,849,873,219,141,958  12,544
2    CL1kEcxLEeOgIQBQVgErYA     == qoKoiuGDbClpcGt/z6RK     85,849,873,219,155,783  12,544
3    oYIVcMxKEeOgIQBQVgErYA     == mfmQiwl7yAteevzJfilM     85,849,873,219,142,006  12,544
4    5N7ME5bM4xGhM7exj3ykUw     == JAf0GpbM4xGhM7exj3yk     85,849,873,219,155,797  12,288
5    JLBH4JfM4xGDH9s5+Ds/8w     == Du6T7pfM4xGDH9s5+Ds/     85,849,873,219,155,768  12,288
6    fGvpoMxKEeOgIQBQVgErYA     == mQUQIK2mY6WIPcszfp5B     85,849,873,219,146,068  12,544

如果我们查看数据,我们可以看到两个问题,

  1. 前两列数据长度为24个CHARACTERS(根据输入文件),但问题是它在下一列中被移动了两个字符。

  2. BUS_EVT_VIDBUS_EVT_RESTATE_IN错误数据85,849,873,219,141,958和12,544分别代替1和1(这可能是因为前两列数据已移位)

  3. 我尝试了以下选项来解决上述问题,但无法解决问题,

    1. 修改了表定义,即更改了数据类型 CHAR(28),CHAR(24),CHAR(26)
    2. 修改了“表定义”列     数据类型为VARCHAR(24),VARCHAR(26)
    3. 修改后的BTEQ命令,即下面一行中改变的数据类型,          使用(APPLICATION_EVENT_ID CHAR(24),BUS_EVT_ID CHAR(24),BUS_EVT_VID BIGINT,BUS_EVT_RESTATE_IN SMALLINT)
    4. 提前致谢。

1 个答案:

答案 0 :(得分:1)

定义VARTEXT时,所有输入列必须定义为VARCHAR,但是您使用了CHAR和INT。

这应该有效,VARCHAR长度基于目标表的定义:

USING(
      APPLICATION_EVENT_ID VARCHAR(26),
      BUS_EVT_ID           VARCHAR(26),
      BUS_EVT_VID          VARCHAR(19),
      BUS_EVT_RESTATE_IN   VARCHAR(6)
     )