Criar uma tabela externa no Hive
No Tutorial: Como trabalhar com o Amazon DynamoDB e o Apache Hive, você criou uma tabela externa do Hive mapeada para uma tabela do DynamoDB. Quando você emitiu instruções HiveQL na tabela externa, as operações de leitura e gravação foram repassadas para a tabela do DynamoDB.
Você pode pensar em uma tabela externa como um ponteiro para uma fonte de dados que é gerenciada e armazenada em outro lugar. Neste caso, a fonte de dados subjacente é uma tabela do DynamoDB. (A tabela já deve existir. Não é possível criar, atualizar ou excluir uma tabela do DynamoDB via Hive.) Você usa a instrução CREATE EXTERNAL TABLE
para criar a tabela externa. Depois disso, você pode usar HiveQL para trabalhar com dados no DynamoDB, como se esses dados estivessem armazenados localmente no Hive.
nota
Você pode usar as instruções INSERT
para inserir dados em uma tabela externa e as instruções SELECT
para selecionar dados nela. No entanto, você não pode usar as instruções UPDATE
ou DELETE
para manipular dados na tabela.
Se não precisar mais da tabela externa, remova-a usando a instrução DROP
TABLE
. Neste caso, DROP TABLE
remove apenas a tabela externa no Hive. Ele não afeta a tabela subjacente do DynamoDB ou qualquer um dos seus dados.
Sintaxe CREATE EXTERNAL TABLE
As considerações a seguir mostram a sintaxe HiveQL para criação de uma tabela externa do Hive mapeada em uma tabela do DynamoDB:
CREATE EXTERNAL TABLE
hive_table
(hive_column1_name
hive_column1_datatype
,hive_column2_name
hive_column2_datatype
...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" ="dynamodb_table"
, "dynamodb.column.mapping" = "hive_column1_name
:dynamodb_attribute1_name
,hive_column2_name
:dynamodb_attribute2_name
..." );
A linha 1 é o início da instrução CREATE EXTERNAL TABLE
, na qual você fornece o nome da tabela do Hive (hive_table) que você deseja criar.
A linha 2 especifica as colunas e os tipos de dados de hive_table. É necessário definir colunas e tipos de dados que correspondem aos atributos da tabela do DynamoDB.
A linha 3 é a cláusula STORED BY
, onde você especifica uma classe que lida com o gerenciamento de dados entre o Hive e a tabela do DynamoDB. Para o DynamoDB, STORED BY
deve ser definido como 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
.
A linha 4 é o início da cláusula TBLPROPERTIES
, na qual você define os parâmetros a seguir para DynamoDBStorageHandler
:
-
dynamodb.table.name
: o nome da tabela do DynamoDB. -
dynamodb.column.mapping
: pares de nomes de coluna na tabela do Hive e seus atributos correspondentes na tabela do DynamoDB. Cada par tem o formato hive_column_name: dynamodb_attribute_name e os pares são separados por vírgulas.
Observe o seguinte:
-
O nome da tabela do Hive não precisa ser o mesmo nome da tabela do DynamoDB.
-
Os nomes das colunas da tabela do Hive não precisam ser os mesmos que os da tabela do DynamoDB.
-
A tabela especificada por
dynamodb.table.name
deve existir no DynamoDB. -
Para
dynamodb.column.mapping
:-
Você deve mapear os atributos de esquema de chaves da tabela do DynamoDB. Isso inclui a chave de partição e a chave de classificação (se houver).
-
Não é necessário mapear os atributos que não são chaves da tabela do DynamoDB. No entanto, você não verá os dados desses atributos ao consultar a tabela do Hive.
-
Se os tipos de dados de uma coluna de tabela do Hive e um atributo do DynamoDB forem incompatíveis, você verá
NULL
nessas colunas ao consultar a tabela do Hive.
-
nota
A instrução CREATE EXTERNAL TABLE
não executa qualquer validação na cláusula TBLPROPERTIES
. Os valores fornecidos para dynamodb.table.name
e dynamodb.column.mapping
são avaliados apenas pela classe DynamoDBStorageHandler
quando você tenta acessar a tabela.
Mapeamentos de tipo de dados
A tabela a seguir mostra os tipos de dados do DynamoDB e os tipos de dados compatíveis do Hive:
Tipo de dados do DynamoDB | Tipo de dados do Hive |
---|---|
String |
|
Número |
|
Binário |
|
String Set |
|
Number Set |
|
Binary Set |
|
nota
Os tipos de dados do DynamoDB a seguir não são compatíveis com a classe DynamoDBStorageHandler
, portanto, eles não podem ser usados com dynamodb.column.mapping
:
-
Mapa
-
Listar
-
Booleano
-
Null
No entanto, se precisar trabalhar com esses tipos de dados, você poderá criar uma única entidade chamada item
que represente todo o item do DynamoDB como um mapa de strings para chaves e valores no mapa. Para ter mais informações, consulte Copiar dados sem um mapeamento de colunas.
Caso deseje mapear um atributo do DynamoDB do tipo Number, será necessário escolher um tipo apropriado do Hive:
-
O tipo do Hive
BIGINT
é para inteiros assinados de 8 bytes. Ele é o mesmo que o tipo de dadoslong
em Java. -
O tipo do Hive
DOUBLE
é para números de ponto flutuante de dupla precisão com 8 bits. Ele é o mesmo que o tipodouble
em Java.
Se você tiver dados numéricos armazenados no DynamoDB que tenham uma maior precisão do que o tipo de dados do Hive que você escolheu, então, acessar os dados do DynamoDB poderia causar uma perda de precisão.
Se você exportar dados do tipo Binary do DynamoDB para (Amazon S3) ou HDFS, os dados serão armazenados como uma string codificada por Base64. Caso importe dados do Amazon S3 ou HDFS para o tipo Binary do DynamoDB, você deverá garantir que os dados sejam codificados como uma string Base64.