O segundo tutorial de uma série sobre como usar a API Apache HBase Thrift
Da última vez, abordamos os fundamentos sobre como conectar-se ao Thrift via Python. Desta vez, você aprenderá a inserir e obter várias linhas por vez.
Trabalhando com tabelas
Usando a interface do Thrift, você pode criar ou excluir tabelas. Vamos dar uma olhada no código Python que cria uma tabela:
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
Neste trecho, você criou um objeto Hbase.ColumnDescriptor. Neste objeto, você pode definir todos os diferentes parâmetros para uma família de colunas. Nesse caso, você define apenas o nome da família de colunas.
Você deve se lembrar do tutorial anterior que adicionar o arquivo Hbase.thrift ao seu projeto geralmente é útil. Este é um desses momentos:você pode abrir o Hbase.thrift e encontrar a definição ColumnDescriptor com todos os seus parâmetros e seus nomes.
Você pode confirmar que existe uma tabela usando o seguinte código:
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
Esse código obtém uma lista das tabelas de usuários, itera por elas e marca o encontrado como verdadeiro se a tabela for encontrada.
Você pode excluir uma tabela usando o seguinte código:
client.disableTable(tablename) client.deleteTable(tablename)
Lembre-se que no HBase, você precisa desabilitar uma tabela antes de excluí-la. Este código faz exatamente isso.
Adicionando linhas com Thrift
O Thrift oferece algumas maneiras de adicionar ou atualizar linhas: uma linha por vez ou várias linhas por vez. A interface Thrift não usa o mesmo objeto Put que a API Java. Essas alterações são chamadas de mutações de linha e usam os objetos Mutation e BatchMutation.
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
Cada objeto Mutation representa as alterações em uma única coluna. Para adicionar ou alterar outra coluna, basta adicionar outro objeto Mutation à lista de mutações.
Quando você terminar de adicionar objetos Mutation, chame o método mutateRow. Esse método usa o nome da tabela, a chave de linha e a lista de mutações como argumentos.
Adicionar várias linhas de uma vez requer algumas alterações:
# Create a list of mutations per work of Shakespeare mutationsbatch = [] for line in shakespeare: rowkey = username + "-" + filename + "-" + str(linenumber).zfill(6) mutations = [ Hbase.Mutation(column=messagecolumncf, value=line.strip()), Hbase.Mutation(column=linenumbercolumncf, value=encode(linenumber)), Hbase.Mutation(column=usernamecolumncf, value=username) ] mutationsbatch.append(Hbase.BatchMutation(row=rowkey,mutations=mutations)) # Run the mutations for the work of Shakespeare client.mutateRows(tablename, mutationsbatch)
Neste exemplo, você ainda está usando o objeto Mutation, mas desta vez você precisa envolvê-los em um objeto BatchMutation. O objeto BatchMutation permite especificar uma chave de linha diferente para cada lista de Mutações. Você também muda para o método mutateRows. É preciso um nome de tabela e o objeto BatchMutation.
Como obter linhas com o Thrift
Usando o método getRow, você pode recuperar uma única linha com base em sua chave de linha. Essa chamada retorna uma lista de objetos TRowResult. Aqui está o código para obter e trabalhar com a saída:
rows = client.getRow(tablename, "shakespeare-comedies-000001") for row in rows: message = row.columns.get(messagecolumncf).value linenumber = decode(row.columns.get(linenumbercolumncf).value) rowKey = row.row
Inicie o código com uma solicitação getRow. Este get retornará a linha com a chave “shakespeare-comedies-000001”. Essas linhas retornarão como uma lista de TRowResult. Usando um loop de linha, você percorre a lista de linhas que foram retornadas.
Para obter o valor de uma coluna, use columns.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Certifique-se de usar a sintaxe de nomenclatura adequada.
Lembre-se de que ao lidar com dados binários como números inteiros, você precisará convertê-los de uma string Python para qualquer tipo que deva ser. Nesse caso, você está pegando a string e tornando-a um inteiro com o método decode.
Obter várias linhas ao mesmo tempo é muito semelhante a obter uma linha. Aqui está o código:
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
Em vez de especificar uma única linha, você passa uma lista de linhas. Você também altera o método para getRows, que usa o nome da tabela e a lista de linhas como argumentos.
Uma lista de objetos TRowResult é retornada e, em seguida, você itera pela lista como no código de linha única.
No próximo e último tutorial, você aprenderá como usar varreduras e obterá uma introdução a algumas considerações ao escolher entre as APIs REST e Thrift para desenvolvimento.
Jesse Anderson é instrutor da Cloudera University.