Lidar com atualizações de esquemas - Amazon Athena

Lidar com atualizações de esquemas

Esta seção apresenta orientações de como processar as atualizações de esquema nos vários formatos de dados. O Athena é um mecanismo de consulta “schema-on-read”. Isso significa que, quando você cria uma tabela no Athena, ele aplica esquemas durante a leitura dos dados. Ela não altera nem reescrever os dados subjacentes.

Se você antecipar alterações nos esquemas de tabela, considere criá-los em um formato de dados adequado para suas necessidades. Seus objetivos são reutilizar as consultas existentes do Athena nos esquemas em desenvolvimento e evitar erros de incompatibilidade de esquemas ao consultar tabelas com partições.

Para atingir essas metas, escolha um formato de dados da tabela com base na tabela no seguinte tópico.

Operações de atualização de esquema com suporte por formato de dados

A tabela a seguir resume os formatos de armazenamento físico de dados e os manuseios do esquema com suporte. Use esta tabela para ajudar a escolher o formato que permitirá que você continue usando as consultas do Athena mesmo que seus esquemas sejam alterados ao longo do tempo.

Nessa tabela, observe que o Parquet e ORC são formatos de coluna com diferentes métodos de acesso padrão à coluna. Por padrão, o Parquet acessa colunas por nome e o ORC por índice (valor ordinal). Portanto, o Athena oferece uma propriedade SerDe definida no momento da criação de uma tabela para alternar o método de acesso padrão a colunas, o que permite maior flexibilidade com o desenvolvimento do esquema.

Para o Parquet, a propriedade parquet.column.index.access pode ser definida como true, que define que o método de acesso à coluna usará o número ordinal da coluna. Definir essa propriedade como false fará com que o método de acesso à coluna use o nome da coluna. Da mesma forma, para ORC, use a propriedade orc.column.index.access para controlar o método de acesso à coluna. Para ter mais informações, consulte Noções básicas do acesso ao índice para Apache ORC e Apache Parquet.

Os formatos CSV e TSV permitem que você faça todos os manuseios do esquema, exceto a reorganização de colunas ou a adição de colunas ao início da tabela. Por exemplo, se a evolução do seu esquema requer apenas a renomeação de colunas, mas não a remoção delas, você pode optar por criar suas tabelas nos formatos CSV ou TSV. Se você precisar remover colunas, não use os formatos CSV ou TSV. Em vez disso, use qualquer um dos outros formatos compatíveis, de preferência um formato de coluna, como Parquet ou ORC.

Atualizações de esquema e formatos de dados no Athena
Tipo esperado de atualização de esquema Resumo CSV (com e sem cabeçalhos) e TSV JSON AVRO PARQUET: leitura por nome (padrão) PARQUET: leitura por índice ORC: leitura por índice (padrão) ORC: leitura por nome
Renomear colunas Armazene seus dados em CSV e TSV, ou em ORC e Parquet se eles são lidos por índice. S N N N S S N
Adicionar colunas no início ou no meio da tabela Armazene seus dados em JSON e AVRO, ou em Parquet e ORC se eles são lidos por nome. Não use CSV e TSV. N S S S N N S
Adicionar colunas no final da tabela Armazene seus dados em CSV ou TSV, JSON, AVRO, ORC ou Parquet. S S S S S S S
Remover colunas Armazene seus dados em JSON e AVRO, ou em Parquet e ORC se eles são lidos por nome. Não use CSV e TSV. N S S S N N S
Reclassificar colunas Armazene seus dados em AVRO, JSON ou em Parquet e ORC se eles são lidos por nome. N S S S N N S
Alterar o tipo de dados de uma coluna Armazene seus dados em qualquer formato, mas faça o teste da consulta no Athena para garantir que os tipos de dados sejam compatíveis. No Parquet e no ORC, a alteração de um tipo de dados funciona apenas para tabelas particionadas. S S S S S S S

Noções básicas do acesso ao índice para Apache ORC e Apache Parquet

PARQUET e ORC são formatos de coluna para armazenamento físico de dados que podem ser lidos por índice ou por nome. O armazenamento dos dados em qualquer um desses formatos permite que você execute todas as operações nos esquemas e execute as consultas do Athena sem erros de incompatibilidade de esquemas.

  • Por padrão, o Athena lê o ORC por índice, conforme definido em SERDEPROPERTIES ( 'orc.column.index.access'='true'). Para ter mais informações, consulte ORC: leitura por índice.

  • O Athena lê Parquet por nome, por padrão, conforme definido em SERDEPROPERTIES ( 'parquet.column.index.access'='false'). Para ter mais informações, consulte Parquet: leitura por nome.

Uma vez que essas leituras são padrão, a especificação das propriedades SerDe em suas consultas CREATE TABLE é opcional; elas são usadas implicitamente. Quando são usadas, elas permitem que você execute algumas operações de atualização de esquema enquanto impedem outras operações semelhantes. Para habilitar essas operações, execute outra consulta CREATE TABLE e altere as configurações SerDe.

nota

As propriedades SerDe não são propagadas automaticamente para cada partição. Use instruções ALTER TABLE ADD PARTITION para definir as propriedades SerDe para cada partição. Para automatizar esse processo, escreva um script que execute instruções ALTER TABLE ADD PARTITION.

As seções a seguir descrevem esses casos em detalhes.

ORC: leitura por índice

Uma tabela no formato ORC é lida por índice, por padrão. Isso é definido pela seguinte sintaxe:

WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')

A leitura por índice permite renomear colunas. No entanto, não será mais possível remover colunas nem as adicionar no meio da tabela.

Para fazer com que o ORC seja lido por nome, o que permitirá que você adicione colunas no meio da tabela ou remova as colunas em ORC, defina a propriedade orc.column.index.access do SerDe como false na instrução CREATE TABLE. Com essa configuração, não será mais possível renomear colunas.

nota

No mecanismo Athena versão 2, quando as tabelas ORC são definidas para serem lidas por nome, o Athena exige que todos os nomes de coluna dos arquivos ORC estejam em letras minúsculas. Como o Apache Spark não usa nomes de campo em letras minúsculas ao gerar arquivos ORC, o Athena talvez não consiga ler os dados que são gerados. A solução alternativa é renomear as colunas usando letras minúsculas ou usar o mecanismo Athena versão 3.

O exemplo a seguir ilustra como alterar o ORC para que ele seja lido por nome:

CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH SERDEPROPERTIES ( 'orc.column.index.access'='false') STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/orders_orc/';

Parquet: leitura por nome

Uma tabela no formato Parquet é lida por nome, por padrão. Isso é definido pela seguinte sintaxe:

WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')

A leitura por nome permite que você remova colunas ou as adicione no meio da tabela. No entanto, não será mais possível renomeá-las.

Para fazer com que o Parquet seja lido por índice, o que permitirá que você renomeie colunas, é necessário criar uma tabela com a propriedade parquet.column.index.access do SerDe e defini-la como true.