O AnalyticDB for PostgreSQL é compatível com a sintaxe do Teradata. Este guia aborda as diferenças de sintaxe, os mapeamentos de tipos de dados e as funções equivalentes necessárias para planejar sua migração do Teradata para o AnalyticDB for PostgreSQL.
Requisitos de migração
Uma migração bem-sucedida do Teradata para o AnalyticDB for PostgreSQL deve atender aos seguintes objetivos:
Migrar completamente a plataforma de dados subjacente do data warehouse.
Garantir uma transição suave para as aplicações implantadas no sistema de data warehouse.
Migrar plataformas de negócios e dados sem impacto perceptível aos usuários.
Assegurar o bom desempenho do data warehouse após a migração.
Estabelecer prazos e planos de migração adequados.
Reaproveitar integralmente a arquitetura original do sistema, os processos de ETL, a estrutura de dados e as ferramentas de gerenciamento.
Escopo da migração
Uma migração completa do Teradata envolve quatro áreas:
Dados históricos: Exporte os dados como arquivos de texto usando o delimitador e a codificação de caracteres especificados. Armazene-os nos discos locais da instância do Elastic Compute Service (ECS) ou em buckets do Object Storage Service (OSS) na mesma rede da instância do AnalyticDB for PostgreSQL e carregue os arquivos por meio de tabelas externas do OSS via protocolo gpfdist. Exporte scripts DDL do Teradata e converta-os em lote utilizando a sintaxe do AnalyticDB for PostgreSQL.
Processos de Extração-Transformação-Carga (ETL): Converta instruções ETL para a sintaxe de Linguagem de Manipulação de Dados (DML) do AnalyticDB for PostgreSQL usando ferramentas de conversão baseadas em script. Substitua as funções do Teradata pelas equivalentes no AnalyticDB for PostgreSQL, conforme a tabela de mapeamento de funções neste documento. Reconfigure e reinicie os jobs de ETL após a conclusão da migração dos dados históricos.
Conexões de API: O AnalyticDB for PostgreSQL suporta os protocolos JDBC e ODBC, permitindo que ferramentas de frontend de Business Intelligence (BI) se conectem da mesma maneira. Atualize o endereço IP da instância para concluir a migração da API.
Ferramentas de gerenciamento: Implante ferramentas de backup e recuperação para a instância do AnalyticDB for PostgreSQL e agende testes regulares de recuperação.
Mapeamento de tipos de dados
A maioria dos tipos de dados principais possui mapeamento direto entre o Teradata e o AnalyticDB for PostgreSQL. As ferramentas de conversão de Linguagem de Definição de Dados (DDL) baseadas em script lidam com a conversão em lote automaticamente.
|
Teradata |
AnalyticDB for PostgreSQL |
Observações |
|
CHAR |
CHAR |
Mapeamento direto |
|
VARCHAR |
VARCHAR |
Mapeamento direto |
|
LONG VARCHAR |
VARCHAR(64000) |
Comprimento máximo fixo |
|
VARBYTE(size) |
BYTEA |
Tipo de dado binário |
|
BYTEINT |
BYTEA |
Tipo de dado binário |
|
SMALLINT |
SMALLINT |
Mapeamento direto |
|
INTEGER |
INTEGER |
Mapeamento direto |
|
DECIMAL(size,dec) |
DECIMAL(size,dec) |
Mapeamento direto |
|
NUMERIC(precision,dec) |
NUMERIC(precision,dec) |
Mapeamento direto |
|
FLOAT |
FLOAT |
Mapeamento direto |
|
REAL |
REAL |
Mapeamento direto |
|
DOUBLE PRECISION |
DOUBLE PRECISION |
Mapeamento direto |
|
DATE |
DATE |
Mapeamento direto |
|
TIME |
TIME |
Mapeamento direto |
|
TIMESTAMP |
TIMESTAMP |
Mapeamento direto |
Instruções de criação de tabela
Os exemplos a seguir mostram como uma instrução DDL do Teradata é mapeada para o AnalyticDB for PostgreSQL. As principais diferenças estão anotadas na instrução convertida.
Teradata:
CREATE MULTISET TABLE test_table,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
first_column DATE FORMAT 'YYYYMMDD' TITLE 'COLUMN 1' NOT NULL,
second_column INTEGER TITLE 'COLUMN 2' NOT NULL ,
third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 3' NOT NULL ,
fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 4' NOT NULL,
fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 5' NOT NULL,
sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 6' NOT NULL,
seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 7' NOT NULL,
eighth_column DECIMAL(18,0) TITLE 'COLUMN 8' NOT NULL ,
nineth_column DECIMAL(18,6) TITLE 'COLUMN 9' NOT NULL )
PRIMARY INDEX ( first_column ,fourth_column )
PARTITION BY RANGE_N(first_column BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY );
CREATE INDEX test_index (first_column, fourth_column) ON test_table;
AnalyticDB for PostgreSQL:
-- MULTISET TABLE, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL,
-- CHECKSUM, DEFAULT MERGEBLOCKRATIO: Teradata-specific clauses removed
-- FORMAT 'YYYYMMDD', TITLE, CHARACTER SET, CASESPECIFIC: column attributes removed
CREATE TABLE test_table
(
first_column DATE NOT NULL, -- FORMAT 'YYYYMMDD' removed; use SET client_encoding for encoding
second_column INTEGER NOT NULL ,
third_column CHAR(6) NOT NULL ,
fourth_column CHAR(20) NOT NULL,
fifth_column CHAR(1) NOT NULL,
sixth_column CHAR(24) NOT NULL,
seventh_column VARCHAR(18) NOT NULL,
eighth_column DECIMAL(18,0) NOT NULL ,
nineth_column DECIMAL(18,6) NOT NULL )
DISTRIBUTED BY ( first_column ,fourth_column ) -- PRIMARY INDEX -> DISTRIBUTED BY
PARTITION BY RANGE(first_column) -- RANGE_N syntax converted to standard RANGE
(START (DATE '1999-01-01') INCLUSIVE
END (DATE '2050-12-31') INCLUSIVE
EVERY (INTERVAL '1 DAY' ) );
create index test_index on test_table(first_column, fourth_column); -- index syntax unchanged
Resumo das diferenças de DDL
|
Área |
Teradata |
AnalyticDB for PostgreSQL |
|
Chave de distribuição |
|
|
|
Particionamento |
|
|
|
Criação de índice |
|
|
|
Título da coluna |
|
|
|
Codificação da coluna |
|
|
|
Atributos da tabela |
|
Não suportado; remova essas cláusulas |
Formatos de importação e exportação de dados
Tanto o Teradata quanto o AnalyticDB for PostgreSQL suportam formatos de arquivo TXT e CSV. A principal diferença reside no separador:
Teradata: Separadores de dois caracteres
AnalyticDB for PostgreSQL: Separadores de caractere único
Converta os separadores em seus arquivos de dados antes do carregamento.
Diferenças em instruções SQL
O AnalyticDB for PostgreSQL suporta a maior parte da sintaxe SQL do Teradata. As instruções a seguir exigem conversão.
CAST
As instruções CAST do Teradata suportam especificadores de formato; o AnalyticDB for PostgreSQL não.
|
Instrução |
Teradata |
AnalyticDB for PostgreSQL |
|
Conversão de inteiro |
|
Escreva uma função personalizada para substituição |
|
Conversão de data |
|
|
QUALIFY
A palavra-chave QUALIFY do Teradata filtra resultados de funções de janela diretamente na consulta. O AnalyticDB for PostgreSQL não suporta QUALIFY; reescreva como uma subconsulta.
Teradata:
SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC)
FROM (SELECT a1.item_id, SUM(a1.sale)
FROM sales AS a1
GROUP BY a1.itemID) AS t1 (itemid, sumprice)
QUALIFY RANK() OVER (ORDER BY sum_price DESC) <=100;
AnalyticDB for PostgreSQL:
-- Wrap the window function in a subquery, then filter in the outer WHERE clause
SELECT itemid, sumprice, rank FROM
(SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) AS rank
FROM (SELECT a1.item_id, SUM(a1.sale)
FROM sales AS a1
GROUP BY a1.itemID) AS t1 (itemid, sumprice)
) AS a
WHERE rank <=100;
MACRO
As macros do Teradata executam um grupo de instruções SQL como uma unidade nomeada. O AnalyticDB for PostgreSQL não suporta macros; use uma FUNCTION em seu lugar.
Teradata:
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS (
SELECT
EmployeeNo,
NetPay
FROM
Salary
WHERE EmployeeNo = :EmployeeNo;
);
AnalyticDB for PostgreSQL:
CREATE OR REPLACE FUNCTION Get_Emp_Salary(
EmployeeNo INTEGER,
OUT EmployeeNo INTEGER,
OUT NetPay FLOAT
) RETURNS SETOF RECORD AS
$$
SELECT EmployeeNo, NetPay
FROM Salary
WHERE EmployeeNo = $1
$$
LANGUAGE SQL;
Mapeamento de funções
A tabela a seguir mapeia funções do Teradata para suas equivalentes no AnalyticDB for PostgreSQL. Para funções sem equivalente direto, a tabela fornece a expressão SQL a ser utilizada.
|
Teradata |
AnalyticDB for PostgreSQL |
Descrição |
|
|
|
Converte NULL para 0 em cálculos cumulativos |
|
|
|
Substitui valores 0 por NULL em dados cumulativos |
|
|
|
Retorna a posição de uma substring dentro de uma string |
|
|
|
Adiciona ou subtrai um número especificado de meses da data de entrada |
|
|
|
Formata dados como string ou data |
|
|
Subconsulta |
Retorna a soma cumulativa de uma expressão de valor para cada linha em uma partição |
|
|
Subconsulta |
Calcula a média móvel de uma coluna especificada com base em um número definido de linhas (largura da consulta) |
|
|
Subconsulta |
Calcula a soma móvel de uma coluna especificada com base em uma largura de consulta definida |
|
|
Subconsulta |
Calcula a diferença móvel de uma coluna especificada com base em uma largura de consulta definida |
|
|
Subconsulta com |
Filtra resultados de funções de janela; consulte a seção QUALIFY acima |
|
|
|
Retorna o número de caracteres em uma string |