Le deuxième tutoriel d'une série sur l'utilisation de l'API Apache HBase Thrift
La dernière fois, nous avons couvert les principes fondamentaux de la connexion à Thrift via Python. Cette fois, vous apprendrez à insérer et à obtenir plusieurs lignes à la fois.
Travailler avec des tableaux
À l'aide de l'interface Thrift, vous pouvez créer ou supprimer des tables. Examinons le code Python qui crée une table :
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
Dans cet extrait, vous avez créé un objet Hbase.ColumnDescriptor. Dans cet objet, vous pouvez définir tous les différents paramètres d'une famille de poteaux. Dans ce cas, vous définissez uniquement le nom de la famille de colonne.
Vous vous souviendrez peut-être de la procédure précédente que l'ajout du fichier Hbase.thrift à votre projet est souvent utile. C'est l'un de ces cas :vous pouvez ouvrir Hbase.thrift et trouver la définition de ColumnDescriptor avec tous ses paramètres et leurs noms.
Vous pouvez confirmer qu'une table existe en utilisant le code suivant :
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
Ce code obtient une liste des tables utilisateur, les parcourt et marque la valeur trouvée comme vraie si la table est trouvée.
Vous pouvez supprimer une table en utilisant le code suivant :
client.disableTable(tablename) client.deleteTable(tablename)
N'oubliez pas que dans HBase, vous devez désactiver une table avant de la supprimer. C'est exactement ce que fait ce code.
Ajouter des lignes avec Thrift
Thrift nous propose plusieurs façons d'ajouter ou de mettre à jour des lignes : une ligne à la fois ou plusieurs lignes à la fois. L'interface Thrift n'utilise pas le même objet Put que l'API Java. Ces modifications sont appelées mutations de ligne et utilisent les objets Mutation et BatchMutation.
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
Chaque objet Mutation représente les modifications apportées à une seule colonne. Pour ajouter ou modifier une autre colonne, il vous suffit d'ajouter un autre objet Mutation à la liste des mutations.
Lorsque vous avez terminé d'ajouter des objets Mutation, vous appelez la méthode mutateRow. Cette méthode prend le nom de la table, la clé de la ligne et la liste des mutations comme arguments.
L'ajout de plusieurs lignes à la fois nécessite quelques modifications :
# 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)
Dans cet exemple, vous utilisez toujours l'objet Mutation mais cette fois vous devez les envelopper dans un objet BatchMutation. L'objet BatchMutation vous permet de spécifier une clé de ligne différente pour chaque liste de mutations. Vous passez également à la méthode mutateRows. Il prend un nom de table et l'objet BatchMutation.
Obtenir des lignes avec Thrift
À l'aide de la méthode getRow, vous pouvez récupérer une seule ligne en fonction de sa clé de ligne. Cet appel renvoie une liste d'objets TRowResult. Voici le code pour obtenir et travailler avec la sortie :
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
Démarrez le code avec une requête getRow. Ce get renverra la ligne avec la clé "shakespeare-comedies-000001". Ces lignes reviendront sous la forme d'une liste de TRowResult. À l'aide d'une boucle de lignes, vous parcourez la liste des lignes qui ont été renvoyées.
Pour obtenir la valeur d'une colonne, utilisez columns.get("COLUMNFAMILY:COLUMDESCRIPTOR"). Assurez-vous d'utiliser la syntaxe de dénomination appropriée.
N'oubliez pas que lorsque vous traitez des données binaires comme des entiers, vous devrez les convertir d'une chaîne Python en n'importe quel type. Dans ce cas, vous prenez la chaîne et en faites un entier avec la méthode de décodage.
Obtenir plusieurs lignes à la fois est très similaire à l'obtention d'une ligne. Voici le code :
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
Au lieu de spécifier une seule ligne, vous transmettez une liste de lignes. Vous modifiez également la méthode en getRows, qui prend le nom de la table et la liste des lignes comme arguments.
Une liste d'objets TRowResult est renvoyée et vous parcourez ensuite la liste comme dans le code à une seule ligne.
Dans le prochain et dernier tutoriel, vous apprendrez à utiliser les analyses et obtiendrez une introduction à certaines considérations lors du choix entre les API REST et Thrift pour le développement.
Jesse Anderson est professeur à l'université Cloudera.