【问题标题】:How to import data into teradata tables from delimited file using BTEQ import?如何使用 BTEQ 导入将数据从分隔文件导入 teradata 表?
【发布时间】:2014-07-09 16:58:08
【问题描述】:

我正在尝试在 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;

示例输入文件分隔符“~”[/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 );

在数据库服务器中设置的结果为,

    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 个字符(根据输入文件),但问题是它在下一列中移动了两个字符。

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

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

  1. 修改了表定义,即将数据类型更改为 CHAR(28),CHAR(24),CHAR(26)
  2. 修改了表定义列 数据类型为 VARCHAR(24)、VARCHAR(26)
  3. 修改了 BTEQ 命令,即在下面的行中改变了数据类型, USING(APPLICATION_EVENT_ID CHAR(24),BUS_EVT_ID CHAR(24),BUS_EVT_VID BIGINT,BUS_EVT_RESTATE_IN SMALLINT)

提前致谢。

【问题讨论】:

    标签: import teradata


    【解决方案1】:

    当您定义 VAREXT 时,所有输入列都必须定义为 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)
         )
    

    【讨论】:

    • 非常感谢您的反馈。我已成功将数据加载到 TD 服务器。 :)
    • 您能否向我提供转换为 VARCHAR SIZE 的数据类型,例如 BIGINT -> VARCHAR(19)、SMALLINT -> VARCHAR(6) ?我应该假设数据类型采用的每个数据字节都是 VARCHAR SIZE 吗?请指教。
    • 这不是数据类型的内部大小,而是作为字符串的外部表示,例如SMALLINT 可以存储 -32768 和 +32767 之间的值,内部两个字节,但 5 位数字加上前导符号作为 VARCHAR。 DECIMAL(n,m) -> n 位加逗号加符号 = VARCHAR(n+2)
    猜你喜欢
    • 2010-11-23
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2015-05-31
    • 2016-03-17
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多