HBase
 sql >> Base de Dados >  >> NoSQL >> HBase

Instruções:usar a interface do Thrift do HBase, parte 2:inserir/obter linhas


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.