sql >> Base de Datos >  >> NoSQL >> HBase

Procedimiento:usar la interfaz HBase Thrift, parte 2:insertar/obtener filas

El segundo tutorial de una serie sobre el uso de la API Thrift de Apache HBase

La última vez, cubrimos los aspectos básicos de la conexión a Thrift a través de Python. Esta vez, aprenderá a insertar y obtener varias filas a la vez.

Trabajar con tablas

Con la interfaz de Thrift, puede crear o eliminar tablas. Echemos un vistazo al código de Python que crea una tabla:

client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])

En este fragmento, creó un objeto Hbase.ColumnDescriptor. En este objeto, puede configurar todos los diferentes parámetros para una familia de pilares. En este caso, solo establece el nombre de la familia de columnas.

Puede recordar de los procedimientos anteriores que agregar el archivo Hbase.thrift a su proyecto suele ser útil. Este es uno de esos momentos:puede abrir Hbase.thrift y encontrar la definición de ColumnDescriptor con todos sus parámetros y sus nombres.

Puede confirmar que existe una tabla usando el siguiente código:

tables = client.getTableNames()

found = False

for table in tables:
	if table == tablename:
		found = True

Este código obtiene una lista de las tablas de usuario, itera a través de ellas y marca como verdadero si se encuentra la tabla.

Puede eliminar una tabla usando el siguiente código:

client.disableTable(tablename)
client.deleteTable(tablename)

Recuerde que en HBase, debe deshabilitar una tabla antes de eliminarla. Este código hace precisamente eso.

Agregar filas con Thrift

Thrift nos ofrece un par de formas de agregar o actualizar filas:una fila a la vez o varias filas a la vez. La interfaz Thrift no utiliza el mismo objeto Put que la API de Java. Estos cambios se denominan mutaciones de fila y utilizan los objetos Mutation y BatchMutation.

mutations = [Hbase.Mutation(
  column='columnfamily:columndescriptor', value='columnvalue')]
client.mutateRow('tablename', 'rowkey', mutations)

Cada objeto de mutación representa los cambios en una sola columna. Para agregar o cambiar otra columna, simplemente agregaría otro objeto Mutación a la lista de mutaciones.

Cuando haya terminado de agregar objetos de mutación, llame al método mutateRow. Este método toma el nombre de la tabla, la clave de la fila y la lista de mutaciones como argumentos.

Agregar varias filas a la vez requiere algunos cambios:

# 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)

En este ejemplo, todavía está utilizando el objeto Mutación, pero esta vez debe envolverlo en un objeto BatchMutation. El objeto BatchMutation le permite especificar una clave de fila diferente para cada lista de Mutaciones. También cambia al método mutateRows. Toma un nombre de tabla y el objeto BatchMutation.

Conseguir filas con Thrift

Con el método getRow, puede recuperar una sola fila en función de su clave de fila. Esta llamada devuelve una lista de objetos TRowResult. Aquí está el código para obtener y trabajar con la salida:

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 el código con una solicitud getRow. Este get devolverá la fila con la clave "shakespeare-comedias-000001". Estas filas volverán como una lista de TRowResult. Usando un bucle de fila, recorre la lista de filas que se devolvieron.

Para obtener el valor de una columna, use column.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Asegúrese de utilizar la sintaxis de nomenclatura adecuada.

Recuerde que cuando trabaje con datos binarios como números enteros, deberá convertirlos de una cadena de Python a cualquier tipo que deba ser. En este caso, está tomando la cadena y convirtiéndola en un número entero con el método de decodificación.

Obtener varias filas a la vez es muy similar a obtener una fila. Aquí está el código:

rowKeys = [ "shakespeare-comedies-000001",
"shakespeare-comedies-000010",
"shakespeare-comedies-000020",
"shakespeare-comedies-000100",
"shakespeare-comedies-000201" ]

rows = client.getRows(tablename, rowKeys)

En lugar de especificar una sola fila, pasa una lista de filas. También cambia el método a getRows, que toma el nombre de la tabla y la lista de filas como argumentos.

Se devuelve una lista de objetos TRowResult y luego itera a través de la lista como en el código de una sola fila.

En el próximo y último instructivo, aprenderá a usar escaneos y obtendrá una introducción a algunas consideraciones al elegir entre las API REST y Thrift para el desarrollo.

Jesse Anderson es profesor de la Universidad de Cloudera.