2013-03-10 1 views
3

J'ai essayé d'insérer une colonne de longtype dans cassandra:Insérer LongType à Cassandra utilisant Thrift échoué

 Column docid = new Column();   
    docid.setName("docid".getBytes());  
    ByteBuffer val = ByteBuffer.allocate(8); 
    val.putLong(123111111111111111L); 
    docid.setValue(val); 
    docid.setTimestamp(System.currentTimeMillis()); 
    client.insert(term, parent, docid, ConsistencyLevel.ONE); 

Il fonctionne bien, mais quand j'ai essayé d'obtenir la valeur par CLI, il retourne

[[email protected]] get Term[utf8('hello')]['docid'] as long; 
=> (column=docid, value=, timestamp=1362891987234) 

Il semble que la valeur n'est pas correctement insérée. Pourquoi?

J'ai essayé d'insérer le type ascii et cela fonctionne.

Répondre

0

Change:

docid.setValue(val); 

Pour:

docid.setValue(val.array()); 
0

Peut-être que vous avez déjà trouvé la solution, ou peut-être vous commutées à CQL mais qui peut aider:

Après avoir mis votre valeur à long dans le ByteBuffer, vous avez oublié de flip() il. Comme expliqué dans javadoc, basculer le tampon signifie en réglant la limite à la position actuelle, puis définir la position actuelle à zéro.

Si vous ne le retournez pas, la valeur contenue est lue à partir de la position actuelle (qui est juste après les octets que vous avez insérés), c'est pourquoi la "valeur" est vide lorsque vous l'interrogez.

Voici le code fixe:

val.putLong(123111111111111111L); 
val.flip(); // Flip the buffer 
docid.setValue(val); 

EDIT:

val.array() retourne un tableau interne du ByteBuffer, donc au lieu de retournement de la mémoire tampon, la mise en valeur de la colonne à val.array() peut également travailler (mais seulement si le tampon d'octets n'est pas directement affecté)

Questions connexes