Ce tutoriel est le troisième d'une série qui explore l'utilisation de l'interface Apache HBase REST. La partie 1 couvre les principes de base de HBase REST, certaines mises en garde Python et l'administration des tables. La partie 2 vous a montré comment insérer plusieurs lignes simultanément à l'aide de XML et de JSON. La partie 3 ci-dessous montrera comment obtenir plusieurs lignes en utilisant XML et JSON.
Obtenir des lignes avec XML
Utiliser un GET
verb, vous pouvez récupérer une seule ligne ou un groupe de lignes en fonction de leurs clés de ligne. (Vous pouvez en savoir plus sur le format d'URL à valeurs multiples ici.) Ici, nous allons utiliser le simple caractère générique ou l'astérisque (*) pour obtenir toutes les lignes commençant par une chaîne spécifique. Dans cet exemple, nous pouvons charger chaque ligne des comédies de Shakespeare avec "shakespeare-comedies-*". Cela nécessite également que nos clés de ligne soient présentées par "AUTHOR-WORK-LINENUMBER".
Voici le code pour obtenir et travailler avec la sortie 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'))
Nous commençons le code avec un get
demande. Ce get
renverra toutes les lignes des comédies de Shakespeare. Ces lignes reviendront au format XML en raison du changement apporté à Accept
en-tête.
Ensuite, nous prenons le XML renvoyé par la requête et le transformons en un DOM XML. Chaque ligne de HBase se trouve dans un élément de ligne distinct. Nous utiliserons un for
boucle pour parcourir chaque ligne.
Chaque cellule de la ligne est un élément XML distinct. Nous utiliserons un autre for
boucle pour parcourir toutes ces cellules. (Ce bloc de code pourrait être simplifié en utilisant XPath pour trouver les éléments corrects.) Au fur et à mesure que chaque colonne est trouvée, la valeur est enregistrée dans une variable. (La méthode de décodage est abordée dans la partie 1 de cette série.) Toutes les valeurs qui reviennent en XML sont encodées en base64 et doivent être décodées avant de les utiliser.
Enfin, la clé de ligne est récupérée et décodée.
Une fois toutes les données trouvées et décodées, vous pouvez commencer à les utiliser. Votre code commencerait après le décodage de la ligne. Gardez à l'esprit que certaines de ces variables n'ont pas besoin d'être décodées - je les fais toutes ici par souci d'exhaustivité.
Obtenir des lignes avec JSON
Travailler avec JSON, c'est comme travailler avec XML :utiliser un get
verb, vous pouvez récupérer une seule ligne ou un groupe de lignes en fonction de leur clé de ligne.
Voici le code permettant d'obtenir et d'utiliser la sortie 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'])
Nous commençons le code avec un get
demande qui renverra toutes les lignes des comédies de Shakespeare. Ces lignes reviendront au format JSON en raison du changement de Accept
en-tête.
Ensuite, nous prenons le JSON renvoyé par la requête et le transformons en un objet JSON. Chaque ligne de HBase se trouve dans un index séparé dans le tableau de lignes. Nous utiliserons un for
boucle pour parcourir chaque ligne.
Chaque cellule de la ligne est un index de tableau distinct. Nous utiliserons un autre for
boucle pour parcourir toutes ces cellules. Au fur et à mesure que chaque colonne est trouvée, la valeur est enregistrée dans une variable. Toutes les valeurs qui reviennent dans JSON sont encodées en base64 et doivent être décodées avant de les utiliser. (Encore une fois, la méthode de décodage est abordée dans la partie 1 de cette série.) Notez que les valeurs reviennent dans l'entrée du signe dollar ($).
Enfin, la clé de ligne est récupérée et décodée.
Une fois toutes les données trouvées et décodées, vous pouvez commencer à les utiliser.
Utiliser boucle
Comme indiqué dans la documentation de l'interface REST, vous pouvez utiliser curl pour générer du XML ou du JSON directement sur la console. Par exemple, vous pouvez faire la même chose que nous venons de faire en utilisant curl. La commande est :
curl -H "Accept: text/xml" http://localhost:8070/tablename/shakespeare-comedies-*
Cette commande vous donnerait la sortie XML. Pour obtenir la sortie JSON, la commande est :
curl -H "Accept: application/json" http://localhost:8070/tablename/shakespeare-comedies-*
Avec des commandes comme celles-ci, vous pouvez rapidement voir ce qui revient ou à quoi ressemblent les données. Vous pouvez utiliser curl pour voir le code d'état d'un appel REST avec :
[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
Conclusion
L'interface HBase REST est un bon moyen d'utiliser HBase si vous ne souhaitez pas utiliser Java. Il vous offre une interface REST familière intégrée à de nombreuses langues ainsi qu'un format de données familier.
Espérons que les exemples de code et les explications de cette série vous éviteront beaucoup de recherches sur Google lorsque vous vous lancerez dans votre projet RESTful HBase.
Jesse Anderson est instructeur à l'université Cloudera.