Este tutorial é o terceiro de uma série que explora o uso da interface Apache HBase REST. A Parte 1 abordou os fundamentos do REST do HBase, algumas advertências do Python e a administração de tabelas. A Parte 2 mostrou como inserir várias linhas simultaneamente usando XML e JSON. A Parte 3 abaixo mostrará como obter várias linhas usando XML e JSON.
Obtendo linhas com XML
Usando um
GET
verbo, você pode recuperar uma única linha ou um grupo de linhas com base em suas chaves de linha. (Você pode ler mais sobre o formato de URL de valor múltiplo aqui.) Aqui, usaremos o caractere curinga simples ou asterisco (*) para obter todas as linhas que começam com uma string específica. Neste exemplo, podemos carregar cada linha das comédias de Shakespeare com “shakespeare-comedies-*”. Isso também requer que nossas chaves de linha sejam definidas por “AUTHOR-WORK-LINENUMBER”. Aqui está o código para obter e trabalhar com a saída XML:
request = requests.get(baseurl + "/" + tablename + "/shakespeare-comedies-*", headers={"Accept" : "text/xml"}) root = fromstring(request.text) # Go through every row passed back for row in root: message = '' linenumber = 0 username = '' # Go through every cell in the row for cell in row: columnname = base64.b64decode(cell.get('column')) if cell.text == None: continue if columnname == cfname + ":" + messagecolumn: message = base64.b64decode(cell.text) elif columnname == cfname + ":" + linenumbercolumn: linenumber = decode(cell.text) elif columnname == cfname + ":" + usernamecolumn: username = base64.b64decode(cell.text) rowKey = base64.b64decode(row.get('key'))
Começamos o código com um
get
solicitação. Este get
retornará todas as falas das comédias de Shakespeare. Essas linhas retornarão como XML devido à alteração no Accept
cabeçalho. Em seguida, pegamos o XML retornado pela solicitação e o transformamos em um XML DOM. Cada linha do HBase está em um elemento de linha separado. Usaremos um
for
loop para percorrer todas as linhas. Cada célula na linha é um elemento XML separado. Usaremos outro
for
loop para passar por todas essas células. (Esse bloco de código pode ser simplificado usando XPath para localizar os elementos corretos.) À medida que cada coluna é encontrada, o valor é salvo em uma variável. (O método de decodificação é discutido na Parte 1 desta série.) Todos os valores que retornam em XML são codificados em base64 e precisam ser decodificados antes de serem usados. Finalmente, a chave de linha é recuperada e decodificada.
Depois que todos os dados forem encontrados e decodificados, você poderá começar a usá-los. Seu código começaria depois de decodificar a linha. Lembre-se de que algumas dessas variáveis não precisam ser decodificadas — estou fazendo todas elas aqui por uma questão de completude.
Como obter linhas com JSON
Trabalhar com JSON é como trabalhar com XML:usar um
get
verbo, você pode recuperar uma única linha ou um grupo de linhas com base em sua chave de linha. Aqui está o código para obter e trabalhar com a saída JSON:
request = requests.get(baseurl + "/" + tablename + "/shakespeare-comedies-*", headers={"Accept" : "application/json"}) bleats = json.loads(request.text) for row in bleats['Row']: message = '' lineNumber = 0 username = '' for cell in row['Cell']: columnname = base64.b64decode(cell['column']) value = cell['$'] if value == None: continue if columnname == cfname + ":" + messagecolumn: message = base64.b64decode(value) elif columnname == cfname + ":" + linenumbercolumn: lineNumber = decode(str(value)) elif columnname == cfname + ":" + usernamecolumn: username = base64.b64decode(value) rowKey = base64.b64decode(row['key'])
Começamos o código com um
get
pedido que retornará todas as falas das comédias de Shakespeare. Essas linhas voltarão como JSON devido à alteração no Accept
cabeçalho. Em seguida, pegamos o JSON retornado pela solicitação e o transformamos em um objeto JSON. Cada linha do HBase está em um índice separado na matriz de linhas. Usaremos um
for
loop para percorrer todas as linhas. Cada célula na linha é um índice de matriz separado. Usaremos outro
for
loop para passar por todas essas células. À medida que cada coluna é encontrada, o valor é salvo em uma variável. Todos os valores que retornam em JSON são codificados em base64 e precisam ser decodificados antes de usá-los. (Novamente, o método de decodificação é discutido na Parte 1 esta série.) Observe que os valores retornam na entrada do cifrão ($). Finalmente, a chave de linha é recuperada e decodificada.
Depois que todos os dados forem encontrados e decodificados, você poderá começar a usá-los.
Usando curl
Conforme mostrado na documentação da interface REST, você pode usar curl para gerar XML ou JSON diretamente no console. Por exemplo, você pode fazer o mesmo get que acabamos de fazer usando curl. O comando é:
curl -H "Accept: text/xml" http://localhost:8070/tablename/shakespeare-comedies-*
Esse comando forneceria a saída XML. Para obter a saída JSON, o comando é:
curl -H "Accept: application/json" http://localhost:8070/tablename/shakespeare-comedies-*
Com comandos como esses, você pode ver rapidamente o que está voltando ou como são os dados. Você pode usar curl para ver o código de status de uma chamada REST com:
[user@localhost HBaseREST]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/shakespeare-comedies-* HTTP/1.1 200 OK Content-Length: 0 Content-Type: text/xml
Conclusão
A interface REST do HBase é uma boa maneira de usar o HBase se você não quiser usar Java. Ele oferece uma interface REST familiar que está integrada em muitos idiomas, bem como um formato de dados familiar.
Esperamos que os exemplos de código e as explicações desta série economizem bastante pesquisa no Google ao embarcar em seu projeto RESTful HBase.
Jesse Anderson é instrutor da Cloudera University.