参考连接
1.TPT文档
2.问题连接1
3.问题连接2
4.decimal精度问题
因此有没有不需要定义源表结构?
目前好像都需要定义表结构
如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
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
则所有字段的数据相同认为是重复
如果文件名为.gz则导出的是压缩文件,如果文件的.txt则导出普通非压缩文件。
新建文件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)
)
新建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