O comando CREATE TABLE cria tabelas não particionadas, particionadas, externas ou clusterizadas.
Limites
Uma tabela particionada pode ter até 6 níveis de partição. Por exemplo, uma tabela particionada por data pode usar os níveis
year/month/week/day/hour/minute.Por padrão, uma tabela pode ter até 60.000 partições. Esse limite é configurável por projeto.
Para outros limites de tabela, consulte Limitações do SQL.
Sintaxe
Tabela interna
Crie uma tabela interna (não particionada ou particionada)
CREATE [OR REPLACE] TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type> [COMMENT <col_comment>], ...)]
[AUTO PARTITIONED
BY (<auto_partition_expression> [AS <auto_partition_column_name>])
[TBLPROPERTIES('ingestion_time_partition'='true')]
];
Tabela clusterizada
Crie uma tabela clusterizada
CREATE TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
INTO <number_of_buckets> BUCKETS];
Tabela externa
Crie uma tabela externa
Este exemplo cria uma tabela externa do OSS usando o analisador de dados de texto integrado. Outros formatos são abordados em Tabela externa ORC.
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> (
<col_name> <data_type>, ... )
STORED AS '<file_format>'
[WITH SERDEPROPERTIES (options)]
LOCATION '<oss_location>';
Tabelas transacionais e Delta
-
Cria uma tabela transacional. É possível executar operações UPDATE ou DELETE nesse tipo de tabela. No entanto, tabelas transacionais possuem limitações.
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> ( <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ... [COMMENT <table_comment>] [TBLPROPERTIES ("transactional"="true")]; -
Cria uma tabela Delta. Quando combinada com uma chave primária, permite realizar operações como upserts, consultas incrementais e time travel.
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> ( <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ... [PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )]) [COMMENT <table_comment>] [CLUSTERED BY (<pk_col_name>[, <pk_col_name2>, ...] )] [TBLPROPERTIES ("transactional"="true" [, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...])] [LIFECYCLE <days>];-
Uma tabela Delta com chave primária permite usar um subconjunto da chave primária como chave de cluster hash.
Em uma tabela Delta com chave primária, o sistema usa clustering hash por padrão, utilizando a chave primária completa como chave de cluster. Se as consultas filtrarem frequentemente por um subconjunto de colunas da chave primária, especifique explicitamente esse subconjunto como chave de cluster para melhorar o desempenho da filtragem.
-
Se você especificar explicitamente uma chave de cluster, o sistema distribui os dados da tabela em buckets hash com base nas colunas especificadas. A chave de cluster deve ser um subconjunto das colunas da chave primária.
Caso nenhuma chave de cluster seja especificada explicitamente, o sistema utiliza o conjunto completo de colunas da chave primária como chave de cluster padrão.
Não é possível modificar a chave de cluster após a criação da tabela. Defina-a no momento da criação.
-
Cláusulas CTAS e LIKE
-
Cria uma nova tabela baseada em uma tabela existente e copia os dados, mas não copia as propriedades de partição. Esta cláusula aplica-se a tabelas externas e a tabelas em projetos Lakehouse externos.
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>; -
Cria uma nova tabela com a mesma estrutura de uma tabela existente, mas sem copiar os dados. Esta cláusula aplica-se a tabelas externas e a tabelas em projetos Lakehouse externos.
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;
Parâmetros
Parâmetros comuns
Parâmetros gerais
|
Parâmetro |
Obrigatório |
Descrição |
Observações |
|
OR REPLACE |
Não |
|
Isso equivale a executar os seguintes comandos:
|
|
EXTERNAL |
Não |
Cria uma tabela externa. |
N/A |
|
IF NOT EXISTS |
Não |
Cria uma tabela apenas se não existir outra com o mesmo nome. |
Sem IF NOT EXISTS, a criação de uma tabela com nome duplicado retorna um erro. Com IF NOT EXISTS, a instrução é bem-sucedida mesmo que exista uma tabela com o mesmo nome, mas com esquema diferente. Os metadados da tabela existente permanecem inalterados. |
|
table_name |
Sim |
O nome da tabela. |
O nome da tabela deve ter no máximo 128 bytes e conter apenas letras, dígitos e underscores (_). Não diferencia maiúsculas de minúsculas. Recomenda-se iniciar o nome com uma letra. |
|
PRIMARY KEY(pk) |
Não |
A chave primária da tabela. |
Defina uma ou mais colunas como chave primária para garantir a unicidade da combinação de colunas. Segue a sintaxe padrão de chave primária SQL. As colunas da chave primária devem ser NOT NULL e não podem ser modificadas. Importante
Este parâmetro aplica-se apenas a uma Delta Table. |
|
col_name |
Sim |
O nome da coluna. |
|
|
col_comment |
Não |
O comentário da coluna. |
Deve ser uma string de no máximo 1.024 bytes. |
|
data_type |
Sim |
O tipo de dados da coluna. |
Tipos suportados: BIGINT, DOUBLE, BOOLEAN, DATETIME, DECIMAL, STRING e outros listados em Tipos de dados. |
|
NOT NULL |
Não |
Especifica que a coluna não pode conter valores NULL. |
Para mais informações sobre como modificar a propriedade NOT NULL, consulte Operações de partição. |
|
default_value |
Não |
O valor padrão para a coluna. |
Se uma operação Nota
Funções como |
|
table_comment |
Não |
O comentário da tabela. |
Deve ser uma string de no máximo 1.024 bytes. |
|
LIFECYCLE |
Não |
O ciclo de vida da tabela, em dias. |
Apenas inteiros positivos são suportados. A unidade é dias.
|
Tabelas particionadas
Parâmetros de tabela particionada
Parâmetros de tabela particionada
O MaxCompute suporta tabelas com particionamento padrão e automático. Escolha o tipo com base na forma como as colunas de partição são geradas. Visão geral de tabelas particionadas.
Parâmetros de tabela com particionamento padrão
|
Parâmetro |
Obrigatório |
Descrição |
Observações |
|
PARTITIONED BY |
Sim |
Especifica as partições para uma tabela com particionamento padrão. |
Você pode especificar partições usando PARTITIONED BY ou AUTO PARTITIONED BY, mas não ambos simultaneamente. |
|
col_name |
Sim |
O nome da coluna de partição. |
|
|
data_type |
Sim |
O tipo de dados da coluna de partição. |
O MaxCompute V1.0 suporta apenas STRING. A versão V2.0 adiciona TINYINT, SMALLINT, INT, BIGINT e VARCHAR (STRING continua suportado). Lista completa em Tipos de dados. O particionamento elimina varreduras completas de tabela para operações no nível de partição. |
|
col_comment |
Não |
O comentário para a coluna de partição. |
Deve ser uma string de no máximo 1.024 bytes. |
Um valor de partição deve ter no máximo 255 bytes. Não pode conter caracteres de byte duplo, como caracteres chineses. O valor deve começar com uma letra e conter apenas letras, dígitos e os seguintes caracteres: espaço, dois pontos (:), underscore (_), cifrão ($), cerquilha (#), ponto (.), ponto de exclamação (!) e arroba (@). O comportamento de outros caracteres, como os caracteres de escape \t, \n e /, é indefinido.
Parâmetros de tabela com particionamento automático
Uma tabela com particionamento automático gera colunas de partição automaticamente. Detalhes de uso estão em Tipos de tabelas particionadas.
|
Parâmetro |
Obrigatório |
Descrição |
Observações |
|
AUTO PARTITIONED BY |
Sim |
Especifica as partições para uma tabela com particionamento automático. |
Você pode especificar partições usando PARTITIONED BY ou AUTO PARTITIONED BY, mas não ambos simultaneamente. |
|
auto_partition_expression |
Sim |
A expressão que define como a coluna de partição é calculada. Atualmente, apenas a função TRUNC_TIME pode ser usada para gerar a coluna de partição. Apenas uma coluna de partição é suportada. |
A função TRUNC_TIME pode truncar dados de uma coluna de tipo tempo ou data com base em uma unidade de tempo especificada para gerar uma coluna de partição. |
|
auto_partition_column_name |
Não |
O nome da coluna de partição gerada. Se nenhum nome for especificado, o sistema usa |
Com base no cálculo da expressão de partição, uma coluna de partição do tipo STRING é gerada. Você pode especificar explicitamente um nome para esta coluna, mas não pode modificar diretamente seu tipo de dados ou valor. |
|
TBLPROPERTIES('ingestion_time_partition'='true') |
Não |
Especifica se as colunas de partição devem ser geradas com base no tempo de ingestão de dados. |
O particionamento por tempo de ingestão é descrito em Tabelas com particionamento automático baseadas no tempo de ingestão de dados. |
Tabelas clusterizadas
Parâmetros de tabela clusterizada
As tabelas clusterizadas são categorizadas em tabelas com cluster hash e tabelas com cluster por intervalo.
Tabela com cluster hash
|
Parâmetro |
Obrigatório |
Descrição |
Observações |
|
CLUSTERED BY |
Sim |
Especifica a chave hash. O MaxCompute calcula valores hash para as colunas especificadas e distribui os dados em buckets hash com base nesses valores. |
Para evitar skew de dados e obter bom paralelismo, escolha colunas com alta cardinalidade e poucos duplicatas para a cláusula |
|
SORTED BY |
Sim |
Especifica a ordem de classificação das colunas dentro de cada bucket hash. |
Para desempenho ideal, use as mesmas colunas para SORTED BY e CLUSTERED BY. Após especificar a cláusula SORTED BY, o MaxCompute cria automaticamente um índice e o utiliza para acelerar consultas. |
|
number_of_buckets |
Sim |
Especifica o número de buckets hash. |
Este valor é obrigatório e depende do volume de dados. Por padrão, o MaxCompute suporta no máximo 1.111 reducers, o que limita o número de buckets hash a 1.111. Você pode executar o comando |
Ao selecionar o número de buckets hash, siga estes dois princípios:
Mantenha o tamanho do bucket hash moderado: O tamanho recomendado para cada bucket hash é de aproximadamente 500 MB. Por exemplo, se o tamanho estimado da partição for 500 GB, defina o número de buckets como 1.000. Isso resulta em um tamanho médio de bucket hash de cerca de 500 MB. Para tabelas muito grandes, você pode exceder o limite de 500 MB. Um tamanho de 2 GB a 3 GB por bucket é adequado. Você também pode executar o comando
set odps.stage.reducer.num=<concurrency>;para ultrapassar o limite de 1.111 buckets hash.Para otimizar operações de
join, remover as etapas de shuffle e sort melhora significativamente o desempenho. Isso requer que o número de buckets hash nas duas tabelas seja múltiplo um do outro, por exemplo, 256 e 512. Recomenda-se definir o número de buckets hash como uma potência de 2 (2n), como 512, 1024, 2048 ou 4096. Isso permite que o sistema divida ou mescle buckets hash automaticamente e remova as etapas de shuffle e sort, melhorando a eficiência da execução.
Tabela com cluster por intervalo
|
Parâmetro |
Obrigatório |
Descrição |
Observações |
|
RANGE CLUSTERED BY |
Sim |
Especifica as colunas de cluster por intervalo. |
O MaxCompute executa operações de bucketing nas colunas especificadas e distribui os dados em buckets com base nos números dos buckets. |
|
SORTED BY |
Sim |
Especifica a ordem de classificação das colunas dentro de cada bucket. |
O uso é o mesmo que para uma tabela com cluster hash. |
|
number_of_buckets |
Sim |
Especifica o número de buckets. |
Para uma tabela com cluster por intervalo, a prática recomendada de potência de 2 (2n) aplicável a tabelas com cluster hash não é necessária. Qualquer número de buckets é aceitável se os dados estiverem distribuídos uniformemente. Este parâmetro é opcional para tabelas com cluster por intervalo. Se omitido, o sistema determina automaticamente o número ideal de buckets com base no volume de dados. |
Quando uma operação de junção ou agregação é realizada em uma tabela com cluster por intervalo, se a chave de junção ou de grupo for a chave de cluster por intervalo ou seu prefixo, é possível eliminar a redistribuição de dados (shuffle remove) para melhorar o desempenho. Você pode executar o comando set odps.optimizer.enable.range.partial.repartitioning=true/false; para ativar ou desativar esse recurso. Ele está desativado por padrão.
-
Benefícios das tabelas clusterizadas:
Pruning de buckets otimizado
Agregações otimizadas
Armazenamento otimizado
-
Limitações das tabelas clusterizadas:
INSERT INTOnão é suportado. Você pode adicionar dados apenas usandoINSERT OVERWRITE.O upload direto de dados para uma tabela com cluster por intervalo via Tunnel não é suportado, pois o Tunnel faz upload de dados de maneira não ordenada.
Recursos de backup e recuperação não são suportados.
Tabelas externas
Parâmetros de tabela externa
Esta seção aborda os parâmetros de tabelas externas do OSS. Outros tipos de tabelas externas estão documentados em Tabelas externas.
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Especifica o file_format com base no formato de dados da tabela externa. |
|
|
Não |
Especifica parâmetros relacionados a autorização, compressão e análise de caracteres para a tabela externa. |
|
oss_location |
Sim |
O local de armazenamento no OSS dos dados da tabela externa. Para mais informações, consulte Tabelas externas do OSS. |
Tabelas transacionais e Delta
Parâmetros de Transactional Table e Delta Table
Parâmetros de Delta Table
Uma Delta Table é um formato de tabela que suporta leituras e gravações quase em tempo real, armazenamento e acesso incrementais e atualizações em tempo real. Atualmente, apenas tabelas com chave primária são suportadas.
|
Parâmetro |
Obrigatório |
Descrição |
Observações |
|
PRIMARY KEY(PK) |
Sim |
Define a chave primária para a Delta Table, que pode incluir várias colunas. |
A sintaxe segue o padrão SQL para chaves primárias. As colunas da chave primária devem ser definidas como NOT NULL e não podem ser modificadas. Após a definição da chave primária, os dados são deduplicados com base nas colunas da chave primária. A restrição de unicidade é aplicada dentro de uma única partição ou dentro de uma tabela não particionada. |
|
transactional |
Sim |
Obrigatório para criar uma Delta Table. Você deve definir este parâmetro como |
Indica que a tabela suporta as propriedades transacionais das tabelas ACID do MaxCompute. A tabela usa o modelo Multi-Version Concurrency Control (MVCC) para garantir o nível de isolamento de snapshot. |
|
write.bucket.num |
Não |
O valor padrão é 16. O intervalo válido é |
Especifica o número de buckets para cada partição ou para uma tabela não particionada. Isso também indica o número de nós concorrentes para gravação de dados. Você pode modificar este parâmetro para uma tabela particionada, e a nova configuração entra em vigor para novas partições. Não é possível modificar este parâmetro para uma tabela não particionada. Considere as seguintes recomendações:
|
|
acid.data.retain.hours |
Não |
O valor padrão é 24. O intervalo válido é |
Especifica o intervalo de tempo, em horas, durante o qual você pode consultar estados históricos de dados usando Time Travel. Se precisar de um histórico de Time Travel superior a 168 horas (7 dias), entre em contato com o suporte técnico do MaxCompute.
|
|
acid.incremental.query.out.of.time.range.enabled |
Não |
Valor padrão: |
Se definido como |
|
acid.write.precombine.field |
Não |
Especifica um único nome de coluna. |
Se um nome de coluna for especificado, o sistema usa essa coluna em combinação com as colunas da chave primária para deduplicar dados dentro do mesmo commit. Isso garante a unicidade e consistência dos dados. Nota
Se um único commit de dados exceder 128 MB, vários arquivos serão gerados. Este parâmetro não se aplica entre múltiplos arquivos. |
|
acid.partial.fields.update.enable |
Não |
Se definido como |
Este parâmetro é definido quando você cria a tabela. Ele não pode ser modificado após a criação da tabela. |
-
Outros requisitos de parâmetros para Delta Tables:
LIFECYCLE: O ciclo de vida da tabela deve ser maior ou igual ao período de retenção do time travel, ou seja,
lifecycle >= acid.data.retain.hours / 24. Uma verificação é realizada quando a tabela é criada, e um erro é reportado se esta condição não for atendida.Recursos não suportados:
CLUSTERED BY,EXTERNALeCREATE TABLE ASnão são suportados.
-
Outras limitações:
Atualmente, outros engines não podem operar diretamente em uma Delta Table. Apenas MaxCompute SQL é suportado.
Não é possível converter uma tabela padrão em uma Delta Table.
Não é possível realizar alterações de esquema nas colunas de chave primária de uma Delta Table.
Parâmetros de Transactional Table
|
Parâmetro |
Obrigatório |
Descrição |
|
|
TBLPROPERTIES("transactional"="true") |
Sim |
Define a tabela como uma Transactional Table, habilitando operações de |
DELETE)](t2043562.dita#concept_2043562). |
As seguintes limitações aplicam-se a uma Transactional Table:
-
Você pode definir a propriedade
transactionalapenas ao criar uma tabela. Não é possível usarALTER TABLEpara modificar essa propriedade em uma tabela existente. A seguinte instrução retorna um erro:ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true"); -- Error returned. FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supported Não é possível definir uma tabela clusterizada ou uma tabela externa como Transactional Table.
Não é possível converter uma tabela interna padrão, tabela externa ou tabela clusterizada em uma Transactional Table, nem vice-versa.
Compactação automática não é suportada. Compacte arquivos manualmente conforme descrito em Compactar arquivos em uma Transactional Table.
A operação
merge partitionnão é suportada.O acesso a Transactional Tables a partir de outros sistemas é limitado. Por exemplo, o MaxCompute Graph não suporta operações de leitura ou escrita. Spark e PAI suportam apenas operações de leitura.
Antes de executar operações de
update,deleteouinsert overwriteem dados importantes, faça backup manual deles em outra tabela usando uma instruçãoSELECT...INSERT.
Criar tabelas a partir de tabelas existentes
Criar tabela (a partir de existente)
-
Use a instrução
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;para criar outra tabela e copiar dados simultaneamente para a nova tabela.Esta instrução não copia propriedades de partição. As colunas de partição da tabela de origem são tratadas como colunas regulares na tabela de destino. A propriedade de ciclo de vida da tabela de origem também não é copiada.
Use o parâmetro lifecycle para especificar um ciclo de vida para a nova tabela. Esta instrução também suporta a criação de uma tabela interna e a cópia de dados de uma tabela externa.
-
Use a instrução
CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;para criar uma nova tabela com o mesmo esquema de uma tabela existente.Esta instrução copia o esquema, mas não copia dados nem a propriedade de ciclo de vida da tabela de origem.
Use o parâmetro lifecycle para especificar um ciclo de vida para a nova tabela. Esta instrução também suporta a criação de uma tabela interna que copia o esquema de uma tabela externa.
Exemplos
Tabela não particionada
-
Crie uma tabela não particionada.
CREATE TABLE test1 (key STRING); -
Crie uma tabela não particionada e especifique valores padrão para as colunas.
CREATE TABLE test_default( tinyint_name tinyint NOT NULL default 1Y, smallint_name SMALLINT NOT NULL DEFAULT 1S, int_name INT NOT NULL DEFAULT 1, bigint_name BIGINT NOT NULL DEFAULT 1, binary_name BINARY , float_name FLOAT , double_name DOUBLE NOT NULL DEFAULT 0.1, decimal_name DECIMAL(2, 1) NOT NULL DEFAULT 0.0BD, varchar_name VARCHAR(10) , char_name CHAR(2) , string_name STRING NOT NULL DEFAULT 'N', boolean_name BOOLEAN NOT NULL DEFAULT TRUE );
Tabela particionada
-
Crie uma tabela particionada AUTO PARTITION que gera partições com base em uma coluna de dados temporal usando uma função de tempo.
-- The sale_date column is truncated by month to generate a partition column named sale_month. The table is then partitioned by this column. CREATE TABLE IF NOT EXISTS auto_sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE, sale_date DATE ) AUTO PARTITIONED BY (TRUNC_TIME(sale_date, 'month') AS sale_month); -
Crie uma tabela particionada AUTO PARTITION que gera partições com base no tempo de ingestão de dados. O sistema recupera automaticamente o momento em que os dados são gravados no MaxCompute e gera partições usando uma função de tempo.
-- After the table is created, when data is written, the system automatically captures the data ingestion time (_partitiontime), truncates it by day, generates a partition column named sale_date, and then partitions the table by this column. CREATE TABLE IF NOT EXISTS auto_sale_detail2( shop_name STRING, customer_id STRING, total_price DOUBLE, _partitiontime TIMESTAMP_NTZ) AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date) TBLPROPERTIES('ingestion_time_partition'='true');
Tabela com cluster hash ou por intervalo
-
Crie uma tabela não particionada com cluster hash.
CREATE TABLE t1 (a STRING, b STRING, c BIGINT) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets; -
Crie uma tabela particionada com cluster hash.
CREATE TABLE t2 (a STRING, b STRING, c BIGINT) PARTITIONED BY (dt STRING) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets; -
Crie uma tabela não particionada com cluster por intervalo.
CREATE TABLE t3 (a STRING, b STRING, c BIGINT) RANGE CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets; -
Crie uma tabela particionada com cluster por intervalo.
CREATE TABLE t4 (a STRING, b STRING, c BIGINT) PARTITIONED BY (dt STRING) RANGE CLUSTERED BY (c) SORTED BY (c);
Tabela transacional
-
Crie uma tabela transacional não particionada.
CREATE TABLE t5(id BIGINT) TBLPROPERTIES ("transactional"="true"); -
Crie uma tabela transacional particionada.
CREATE TABLE IF NOT EXISTS t6(id BIGINT) PARTITIONED BY (ds STRING) TBLPROPERTIES ("transactional"="true");
Tabela interna
-
Crie uma tabela interna copiando dados de uma tabela externa particionada. A tabela interna não incluirá propriedades de partição.
-
Crie uma tabela externa do OSS e uma tabela interna do MaxCompute. Crie uma tabela interna usando CREATE TABLE AS.
-- Create an OSS external table and insert data into it. CREATE EXTERNAL TABLE max_oss_test(a INT, b INT, c INT) STORED AS TEXTFILE LOCATION "oss://oss-cn-hangzhou-internal.aliyuncs.com/<bucket_name>"; INSERT INTO max_oss_test VALUES (101, 1, 20241108), (102, 2, 20241109), (103, 3, 20241110); SELECT * FROM max_oss_test; -- Result a b c 101 1 20241108 102 2 20241109 103 3 20241110 -- Create an internal table by using CREATE TABLE AS. CREATE TABLE from_exetbl_oss AS SELECT * FROM max_oss_test; -- Query the new internal table. SELECT * FROM from_exetbl_oss; -- The result shows that all data is copied. a b c 101 1 20241108 102 2 20241109 103 3 20241110 -
Execute o comando
DESC from_exetbl_oss;para visualizar o esquema da tabela interna. O comando retorna a seguinte saída.+------------------------------------------------------------------------------------+ | Owner: ALIYUN$*********** | | Project: ***_*****_*** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-01-10 15:16:33 | | LastDDLTime: 2023-01-10 15:16:33 | | LastModifiedTime: 2023-01-10 15:16:33 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 919 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | string | | | | b | string | | | | c | string | | | +------------------------------------------------------------------------------------+
-
-
Crie uma tabela interna copiando o esquema de uma tabela externa particionada. A tabela interna inclui propriedades de partição.
-
Crie a tabela interna
from_exetbl_like. Consulte a tabela externa do OSS a partir do MaxCompute. Crie uma tabela interna usando CREATE TABLE LIKE.-- Query the OSS external table from MaxCompute. SELECT * FROM max_oss_test; -- Result a b c 101 1 20241108 102 2 20241109 103 3 20241110 -- Create an internal table by using CREATE TABLE LIKE. CREATE TABLE from_exetbl_like LIKE max_oss_test; -- Query the new internal table. SELECT * FROM from_exetbl_like; -- Result: Only the table schema is returned. a b c -
Execute o comando
DESC from_exetbl_like;para visualizar o esquema da tabela interna. O comando retorna a seguinte saída.+------------------------------------------------------------------------------------+ | Owner: ALIYUN$************ | | Project: ***_*****_*** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-01-10 15:09:47 | | LastDDLTime: 2023-01-10 15:09:47 | | LastModifiedTime: 2023-01-10 15:09:47 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | string | | | | b | string | | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | c | string | | +------------------------------------------------------------------------------------+
-
Tabela Delta
-
Crie uma tabela Delta.
CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) TBLPROPERTIES ("transactional"="true"); -
Crie uma tabela Delta e defina propriedades chave da tabela.
CREATE TABLE mf_tt2 ( pk BIGINT NOT NULL, pk2 BIGINT NOT NULL, val BIGINT, val2 BIGINT, PRIMARY KEY (pk, pk2) ) TBLPROPERTIES ( "transactional"="true", "write.bucket.num" = "64", "acid.data.retain.hours"="120" ) LIFECYCLE 7;
Outros métodos
Substituir uma tabela existente
-
Crie a tabela original
my_tablee insira dados nela.CREATE OR REPLACE TABLE my_table(a BIGINT); INSERT INTO my_table(a) VALUES (1),(2),(3); -
Use
OR REPLACEpara criar uma nova tabela com o mesmo nome e modificar suas colunas.CREATE OR REPLACE TABLE my_table(b STRING); -
Consulte a tabela
my_table. A consulta retorna o seguinte resultado.+------------+ | b | +------------+ +------------+As seguintes instruções SQL são inválidas:
CREATE OR REPLACE TABLE IF NOT EXISTS my_table(b STRING); CREATE OR REPLACE TABLE my_table AS SELECT; CREATE OR REPLACE TABLE my_table LIKE newtable;
Copiar dados e definir um ciclo de vida
-- Create a new table named sale_detail_ctas1, copy the data from sale_detail to it, and set a lifecycle.
SET odps.sql.allow.fullscan=true;
CREATE TABLE sale_detail_ctas1 LIFECYCLE 10 AS SELECT * FROM sale_detail;
Execute o comando DESC EXTENDED sale_detail_ctas1; para visualizar detalhes como o esquema e o ciclo de vida da tabela.
Neste exemplo, sale_detail é uma tabela particionada. Ao usar a instrução CREATE TABLE ... AS select_statement ... para criar a tabela sale_detail_ctas1, as propriedades de partição não são copiadas. As colunas de partição da tabela de origem tornam-se colunas regulares na tabela de destino. Portanto, sale_detail_ctas1 é uma tabela não particionada com cinco colunas.
Usar constantes para valores de coluna
Se você usar constantes como valores de coluna na cláusula SELECT, especifique nomes de colunas. Caso contrário, a quarta e a quinta colunas na tabela criada sale_detail_ctas3 receberão nomes padrão como _c4 e _c5.
-
Especifique nomes de colunas.
SET odps.sql.allow.fullscan=true; CREATE TABLE sale_detail_ctas2 AS SELECT shop_name, customer_id, total_price, '2013' AS sale_date, 'China' AS region FROM sale_detail; -
Não especifique nomes de colunas.
SET odps.sql.allow.fullscan=true; CREATE TABLE sale_detail_ctas3 AS SELECT shop_name, customer_id, total_price, '2013', 'China' FROM sale_detail;
Copiar um esquema e definir um ciclo de vida
CREATE TABLE sale_detail_like LIKE sale_detail LIFECYCLE 10;
Execute o comando DESC EXTENDED sale_detail_like; para visualizar detalhes como o esquema e o ciclo de vida da tabela.
O esquema de sale_detail_like é idêntico ao esquema de sale_detail. Todas as propriedades, como nomes de colunas, comentários de colunas e comentários de tabela, são copiadas, exceto a propriedade de ciclo de vida. No entanto, os dados em sale_detail não são copiados para a tabela sale_detail_like.
Copiar um esquema de uma tabela externa
-- Create a new table named mc_oss_extable_orc_like that has the same schema as the external table mc_oss_extable_orc.
CREATE TABLE mc_oss_extable_orc_like LIKE mc_oss_extable_orc;
Execute o comando DESC mc_oss_extable_orc_like; para visualizar detalhes como o esquema da tabela.
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@***.aliyunid.com | Project: max_compute_7u************yoq |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2022-08-11 11:10:47 |
| LastDDLTime: 2022-08-11 11:10:47 |
| LastModifiedTime: 2022-08-11 11:10:47 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| id | string | | |
| name | string | | |
+------------------------------------------------------------------------------------+
Novos tipos de dados
SET odps.sql.type.system.odps2=true;
CREATE TABLE test_newtype (
c1 TINYINT,
c2 SMALLINT,
c3 INT,
c4 BIGINT,
c5 FLOAT,
c6 DOUBLE,
c7 DECIMAL,
c8 BINARY,
c9 TIMESTAMP,
c10 ARRAY<MAP<BIGINT,BIGINT>>,
c11 MAP<STRING,ARRAY<BIGINT>>,
c12 STRUCT<s1:STRING,s2:BIGINT>,
c13 VARCHAR(20))
LIFECYCLE 1;
Comandos relacionados
ALTER TABLE: Modifica a estrutura ou propriedades de uma tabela.
TRUNCATE TABLE: Remove todos os dados de uma tabela.
DROP TABLE: Exclua uma tabela.
DESC TABLE/VIEW: Visualize informações sobre uma tabela interna, view, materialized view, tabela externa, tabela clusterizada ou tabela transacional do MaxCompute.
SHOW: Visualize a instrução SQL DDL de uma tabela, todas as tabelas e views em um projeto ou todas as partições em uma tabela.