Teradata TPT(Teradata Parallel Transporter)使用

参考连接

1.TPT文档
2.问题连接1
3.问题连接2
4.decimal精度问题

一. Teradata的tpt文件中表结构定义简化方式

组装表结构到tpt文件中

  1. 通过参数传递比较麻烦
  2. 生成新的tpt文件也比较麻烦

因此有没有不需要定义源表结构?

目前好像都需要定义表结构

示例

如tpt文件定义如下,此时需要设置表结构,用参数@DataSchema表示

格式: DEFINE SCHEMA <name> ‘tablename’;

DEFINE SCHEMA <name> @SourceTableName;

USING CHARACTER SET UTF8
DEFINE JOB EXPORT_TO_INDICDATA_FILE_FORMAT
DESCRIPTION 'Export From ' || @SourceTableName || ' to the INDICDATA file: ' || @DataFileName
(
    DEFINE SCHEMA @SchemaName
    (
        @DataSchema
    );

      DEFINE OPERATOR EXPORT_OPERATOR
      TYPE EXPORT
      SCHEMA @SchemaName
      ATTRIBUTES
      (
          VARCHAR PrivateLogName = @SourceTableName || '.log',
          VARCHAR TdpId          = @TdpId,
          VARCHAR UserName       = @UserName,
          VARCHAR UserPassword   = @UserPassword,
          VARCHAR DateForm       = 'INTEGERDATE',
          VARCHAR SelectStmt     = 'SELECT * FROM ' || @SourceTableName
      );

解决方案

1.表结构相同上述SCHEMA定义可以简化,省去组装表结构操作

DEFINE SCHEMA @SchemaName   @DataSchema;

参数 @DataSchema 格式为:库名+表名,点号连接 [dbname.tablename],通过脚本传递需加单引号(注单引号转义 "DataSchema=‘dbname.T1’ ")

2 .报错:error 3862,The tables in BEGIN LOADING statement must be different

扫描二维码关注公众号,回复: 15381749 查看本文章

LOAD的ATTRIBUTES里面不配置错误表 ErrorTable1 ErrorTable2,解决

3.步骤APPLY中语句合并会报错

 STEP Setup_Tables
 (
   APPLY
   (@DROP_T),
   (@DROP_LOG),
   (@DROP_E1),
   (@DROP_E2),
   (@CREATE_T)
   TO OPERATE(DDL_OPERATOR);
 );

 STEP INSERT_INTO_TABLE
 (
   APPLY
   (
       @SQL
   )
   TO OPERATOR (LOAD_OPERATOR)
   SELECT * FROM OPERATOR(EXPORT_OPERATOR);
 );

如参数为 ‘DROP_T=DROP TABLE XXX;’
错误一
若参数打算多条封装成一条如’DROP TABLE T1;DROP TABLE T2’,报错
因此这里定义的语句需要提前设计好,或者不通过设置步骤这种方式操作

14.10版本@DataSchema传递表名没问题
15.10版本报错
可能由如下原因导致:

DEFINE SCHEMA schema-name ‘DBS table name’
DEFINE SCHEMA schema-name DELIMITED ‘DBS table name’
过时了as being obsolete, and not to use.

The syntax should be:
DEFINE SCHEMA schema-name FROM TABLE ‘DBS table name’
DEFINE SCHEMA schema-name FROM TABLE DELIMITED ‘DBS table name’
最终方案
加不加FROM TABLE 都可以

错误二
the user does not create table … access XXDB
用户已经授权XXDB库了,还是报上述错误
解决方法:
删除步骤三Setup_Tables

错误三
load error 3261 … unless secondary indexs and join indexs are removed
解决方法:
建表语句不加次级索引及其他联合索引(可以有主索引)

错误四
TPT02638:Error: Conflicting data length for column . “xxx”. Source column’s data length(16)
Target column’s data length (8).
EXPORT_OPERATOR:TPT12108:Output Schema does not match data from SELECT statement

解决方法:
默认情况下TPT支持18(8)字节十进制精度,源列定义为十进制,精度为24(需要16字节)
设置ExportOperator 属性 MaxDecimalDigits=31

重复数据问题

建表语句NPI方式,向该表加载数据时不会去重。否则fastload加载默认去重复

create MULTISET table TESTDB.TEST_A AS TESTDB.TEST WITH NO DATA NO PRIMARY INDEX;
-- 若TESTDB.TEST表有次级索引等其他索引,则TESTDB.TEST_A表需要删除对应的索引
DROP INDEX(字段名) ON TESTDB.TEST_A;

当表结构的字段设置了unique如
unique primary index(A)
则A字段数据相同认为是重复
若表结构字段都没偶设置unique
则所有字段的数据相同认为是重复

二. 使用TPT方式导出文件

如果文件名为.gz则导出的是压缩文件,如果文件的.txt则导出普通非压缩文件。

1.新建配置文件

新建文件exportFile.tpt

DEFINE JOB EXPORT_FILE
DESCRIPTION 'EXPORT FILE'
(
    DEFINE SCHEMA @schemaName @schemaAndTable;
    DEFINE OPERATOR @EXPOTOR
    TYPE EXPORT
    SCHEMA @schemaName
    ATTRIBUTES
    (
        VARCHAR TdpId=@server,
        VARCHAR UserName=@User,
        VARCHAR UserPassword=@Pwd,
        VARCHAR ReportModeOn='Y',
        INTEGER MaxSessions=4,
        INTEGER TenacitySleep=2,
        INTEGER MaxDecimalDigits=38,
        VARCHAR IgnoreMaxDecimalDigits='NO',
        VARCHAR SpoolMode='NOSPOOL',
        VARCHAR DateForm='ANSIDATA',
        VARCHAR SelectStmt=@querySql
   );
   DEFINE OPERATOR FILE_WRITER
   TYPE DATACONNECTOR CONSUMER
   SCHEMA @schemaName
   ATTRIBUTES
   (
       VARCHAR EscapeTextDelimiter='\\',
       VARCHAR EscapeQuoteDelimiter='\\"',
       VARCHAR TruncateColumnData='N',
       VARCHAR RecordErrorVerbosity='Med',
       VARCHAR TextDelimiter=@Delimiter,
       VARCHAR DirectoryPath=@exportFilePath,
       VARCHAR FileName=@onlyFileName,
       VARCHAR OpenMode='Write',
       VARCHAR IndicatorMode='N',
       VARCHAR TrimChar=' ',
   );
   APPLY TO OPERATOR(FILE_WRITER)
   SELECT * FROM OPERATOR(@EXPOTOR)
)

2.脚本调用

新建test.sh

# ATTRIBUTES接收的字符串类型参数需要加单引号,通常select语句中可能需要将单个单引号变成两个单引号
# ATTRIBUTES接收的数值类型参数不需要单引号
params="schemaName =\'name1\',schemaAndTable=\'public.test_table1\',EXPOTOR=\'export_test_table1\',server=\'dbc\',User=\'user1\',Pwd=\'pass123456\',querySql=\'SELECT COL1,COL2 FROM public.test_table1 where col3=''20220101'';\',Delimiter=\',\',exportFilePath=\'/tmp/dir\',onlyFileName=\'test_table1.dat.gz\'"
tlogs=`tbuild -f /tmp/exportfile.tpt -u "$params" -j export_test -C -L /tmp/logs -r /tmp/check` 
echo $?
echo $tlogs

# 无需从检查点重启-R 0

猜你喜欢

转载自blog.csdn.net/u010895512/article/details/121387947