¿La forma más sencilla de insertar datos en una nueva base de datos de Cassandra utilizando la API de Hector?
(2)
Espero que hayas podido hacer esto ahora, pero así es como lo hice.
Tengo una instalación de cassandra (usando 1.1.4) y supongo que tiene todos los directorios necesarios creados:
/var/lib/cassandra
/var/lib/casandra/data
/var/lib/cassnadra/commitlogs
/var/lib/cassandra/saved_caches
Lo comienzo usando:
bin/cassandra -f
Creo un script simple llamado schema_create.txt:
CREAR PRUEBA DE KEYSPACE
CON strategy_class = ''org.apache.cassandra.locator.SimpleStrategy'' AND strategy_options: replication_factor = ''1''; usar TEST; CREATE COLUMNFAMILY TestColumnFamily (userid varchar, firstname varchar, lastname varchar, PRIMARY KEY (userid));
Luego, desde la línea de comandos, puede ejecutar esta secuencia de comandos utilizando la nueva herramienta CQL que viene con cassandra de la siguiente manera:
bin/cqlsh --cql3 < schema_createt.txt
Esto instalará un casillero llamado test con una familia de columnas llamada testcolumnfamily en cassandra.
Ahora, desde dentro de su aplicación java, puede simplemente crear una clase de prueba que tenga un método principal (supongo que su entorno de desarrollo tiene todas las dependencias necesarias si usa maven):
try {Mutator mutator = HFactory.createMutator (kweyspace, stringSerializer.get ()); mutator.addInsertion ("iamauser", "tescolumnfamily", HFactory.createStringColumn ("firstname", "John")); mutator.addInsertion ("iamauser", "testcolumnfamily", HFactory.createStringColumn ("lastname", "Smith")); mutator.execute (); } catch (HectorException Hex) {Hex.printStackTrace (); } finally {cluster.getConnectionManger (). shutdown (); }
Ahora regrese a la línea de comando y entre en cassandra usando:
$bin/cqlsh --cql3
use test;
select * from testcolumnfamily;
Esto insertará una fila de datos en su cassandra db con la clave iamauser, y el nombre como John Smith y usted puede verificar como se muestra arriba usando la herramienta cqlsh.
Espero que esto ayude.
He seguido numerosos ejemplos sobre la inserción de datos en una base de datos de Cassandra y cada vez que recibo una excepción sobre familias de columnas no configuradas.
Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:unconfigured columnfamily TestColumnFamily)
at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:252)
at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:97)
at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243)
at me.prettyprint.cassandra.model.MutatorImpl.insert(MutatorImpl.java:69)
at CassandraInterface.main(CassandraInterface.java:101)
Caused by: InvalidRequestException(why:unconfigured columnfamily TestColumnFamily)
at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:19477)
at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:1035)
at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:1009)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:246)
... 4 more
Así que busqué cómo configurarlos y encontré
BasicColumnFamilyDefinition cfdef = new BasicColumnFamilyDefinition();
cfdef.setKeyspaceName(keyspaceName);
cfdef.setName(columnFamilyName);
cfdef.setKeyValidationClass(ComparatorType.UTF8TYPE.getClassName());
cfdef.setComparatorType(ComparatorType.UTF8TYPE);
Eso no configuró la familia de columnas.
Todos los ejemplos que he encontrado son fragmentos sin ningún contexto, por lo que no sé qué importar o configurar. Además, algunos ejemplos parecen mezclar el Hector API v2 y el Hector API original, así que cuando los utilizo, obtengo errores de compilador de "clase no encontrada" o "función no encontrada".
Hector CassandraClusterTest.java
@Test
public void testAddDropColumnFamily() throws Exception {
ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("Keyspace1", "DynCf");
cassandraCluster.addColumnFamily(cfDef);
String cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf");
assertNotNull(cfid2);
// Let''s wait for agreement
cassandraCluster.addColumnFamily(cfDef, true);
cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf", true);
assertNotNull(cfid2);
}
Para abreviar, debe existir el espacio del teclado y la familia de columnas antes de intentar insertar datos en ellos. Puede administrar esto en su código, verificar si existen, usar el ejemplo anterior como una buena referencia, o modificar a través de la interfaz de línea de comando ( cassandra-cli
)