【问题标题】:Export result of a query to a text file by Teradata Parallel transporter通过 Teradata Parallel transporter 将查询结果导出到文本文件
【发布时间】:2017-09-30 22:45:37
【问题描述】:

我需要自动将大量数据(通过 sql 查询从 TERADATA)导出到管道分隔的文本文件。我使用了 PowerShell (ConvertTo-CSV cmdlet),但速度很慢。 有人建议我使用 TPT 导出,但我从未使用过此工具,我发现的只是如何将一个表导出到平面文件,而不是一个包含多个表的复杂查询。 有人知道如何进行 TPT 或有一个脚本示例吗?

编辑:

我正在将此脚本用于 TPT,但我认为它有很多错误

DEFINE JOB EXPORT_DELIMITED_FILE
DESCRIPTION 'Export rows from a Teradata table to a delimited file'
(
DEFINE SCHEMA select EXPORT_DELIMITED_FILE from DELIMITED OF OPERATOR SQL_SELECTOR  
DEFINE OPERATOR SQL_SELECTOR
TYPE SELECTOR
SCHEMA *
ATTRIBUTES
(
VARCHAR PrivateLogName = 'selector_log',
VARCHAR TdpId = 'Server',
VARCHAR UserName = 'user',
VARCHAR UserPassword = 'password',
VARCHAR SelectStmt = 'E:\PowerShell\SQL\file.sql',
VARCHAR ReportModeOn
);
DEFINE OPERATOR FILE_WRITER
TYPE DATACONNECTOR CONSUMER
SCHEMA *
ATTRIBUTES
(
VARCHAR PrivateLogName = 'dataconnector_log',
VARCHAR DirectoryPath = 'E:\PowerShell\Output',
VARCHAR FileName = 'test_file.txt',
VARCHAR Format = 'Delimited',
VARCHAR OpenMode = 'Write',
VARCHAR TextDelimiter = '|'
);
APPLY TO OPERATOR (FILE_WRITER)

SELECT * FROM OPERATOR (SQL_SELECTOR);
);

【问题讨论】:

  • 您可以提供一个复杂的查询作为 TPT 中 Export 运算符的 SelectStmt 参数。尝试执行脚本并发布您遇到的任何困难。可以在线找到许多示例和示例脚本。例如,请参阅此link 请参阅 Teradata Parallel Transporter 快速入门指南以获取一般入门指南,Teradata Parallel Transporter Reference 以获取完整参考。
  • 我已经制作了下面的脚本并且我有以下错误,实际上我不确定要定义架构的内容:语法错误:无效令牌''遵循语法“DEFINE SCHEMA” "。

标签: sql powershell csv export teradata


【解决方案1】:

您的架构定义错误。 Schema 定义了您的数据集在字段名称和数据类型方面的外观。

生产者运算符(在您的情况下为 SQL 选择器)始终需要具有已定义的架构。延迟模式 (SCHEMA *) 只能与消费者运算符(在您的情况下为数据连接器)一起使用,这允许消费者具有与相关生产者相同的模式。

架构定义如下所示:

DEFINE SCHEMA FILE_SCHEMA
(
    Column1 VARCHAR(255),
    Column2 VARCHAR(255),
    Column3 VARCHAR(255),
    Column4 VARCHAR(255)
);

请记住,数据连接器运算符仅接受架构中的字符数据。如果指定任何其他数据类型,则会导致错误。

此外,SelectStmt 必须包含一个实际的 SQL 查询,而不是包含查询的文件的路径。要通过数据连接器运算符将数据导出到平面文件,您需要在查询中将所有内容转换为 VARCHAR 类型

SelectStmt = 'SELECT CAST(ColumnA AS VARCHAR(100), CAST(ColumnB AS VARCHAR(100), CAST(ColumnC AS VARCHAR(100), CAST(COUNT(*) AS VARCHAR(100)) FROM MyTable GROUP BY 1,2,3,4;'

请注意,SelectStmt 返回的列数与定义模式相同。

同时设置ReportModeOn = 'Y',而不是将其保留为默认值。

始终记得缩进代码。使用缩进,脚本现在看起来像:

DEFINE JOB EXPORT_DELIMITED_FILE
DESCRIPTION 'Export rows from a Teradata table to a delimited file'
(
    DEFINE SCHEMA FILE_SCHEMA
    (
        Column1 VARCHAR(100),
        Column2 VARCHAR(100),
        Column3 VARCHAR(100),
        Column4 VARCHAR(100)
    );

    DEFINE OPERATOR SQL_SELECTOR
    TYPE SELECTOR
    SCHEMA FILE_SCHEMA
    ATTRIBUTES
    (
        VARCHAR PrivateLogName = 'selector_log',
        VARCHAR TdpId = 'Server',
        VARCHAR UserName = 'user',
        VARCHAR UserPassword = 'password',
        VARCHAR SelectStmt = 'SELECT CAST(ColumnA AS VARCHAR(100), CAST(ColumnB AS VARCHAR(100), CAST(ColumnC AS VARCHAR(100), CAST(COUNT(*) AS VARCHAR(100)) FROM MyTable GROUP BY 1,2,3;',
        VARCHAR ReportModeOn = 'Y'
    );

    DEFINE OPERATOR FILE_WRITER
    TYPE DATACONNECTOR CONSUMER
    SCHEMA *
    ATTRIBUTES
    (
        VARCHAR PrivateLogName = 'dataconnector_log',
        VARCHAR DirectoryPath = 'E:\PowerShell\Output',
        VARCHAR FileName = 'test_file.txt',
        VARCHAR Format = 'Delimited',
        VARCHAR OpenMode = 'Write',
        VARCHAR TextDelimiter = '|'
    );

    APPLY TO OPERATOR (FILE_WRITER)
    SELECT * FROM OPERATOR (SQL_SELECTOR);
);

【讨论】:

  • 谢谢,我仍然有一些像这样的错误:TPT_INFRA:作业脚本文件'space.tpt'的第399行或附近的语法错误:TPT_INFRA:TPT03046:规则:DEFINE OPERATOR编译失败由于错误。未生成执行计划。作业脚本编译失败。
  • 有没有办法把路径放到sql(因为它是一个非常大的300行)
  • 遗憾的是,没有直接的方法将 SQL 放入文件中。隐藏复杂性的一种简单方法是将整个 SQL 放在数据库视图中并使用 SELECT * FROM ViewName; 作为 SelectStmt。共享脚本中没有 399 行,我假设问题是由于您使用的 SELECT 语句造成的。确保查询中的任何单引号都被附加单引号正确转义,以避免不正确的关闭引号匹配。但是,如果您将逻辑隐藏在数据库视图中,则不需要这样做。
  • 数据连接器仅使用 char/varchar 类型。你可以使用TRIM ( TRAILING '.' FROM ColumnName) 来解决这个问题。
  • 谢谢它的工作,请另一个问题,我看到使用 ReportModeOn = 'Y' 时,我的类型应该是 varchar。有没有办法使用另一种类型?我的数据主要是十进制(7,0),当我将其转换为 sql 时,我输出的数字带有“。”最后(例如 123456. insted of 123456)。另一件事是我使用了 trim 函数来占用可以导入结果的空间( trim(cast ( d.eanmax as varchar(20))) )但该函数似乎不起作用。提前致谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2018-11-03
  • 2023-04-04
相关资源
最近更新 更多