2012-09-28 3 views
1

J'ai quelques questions à propos de Hector Insérez les données à double/flotteur dans CassandraPourquoi insérer double colonne/flotteur dans Cassandra par hector et a obtenu la base de données de valeur incorrecte int

new Double("13.45")------->13.468259733915328 
new Float("64.13") ------->119.87449 

Quand j'insérer des données dans Cassandra par hector

TestDouble ch = new TestDouble("talend_bj", 
     "localhost:9160"); 
String family = "talend_1"; 
ch.ensureColumnFamily(family); 
List values = new ArrayList(); 
values.add(HFactory.createColumn("id", 2, StringSerializer.get(), 
     IntegerSerializer.get())); 
values.add(HFactory.createColumn("name", "zhang", 
     StringSerializer.get(), StringSerializer.get())); 
values.add(HFactory.createColumn("salary", 13.45, 
     StringSerializer.get(), DoubleSerializer.get())); 
ch.insertSuper("14", values, "user1", family, StringSerializer.get(), 
     StringSerializer.get()); 
StringSerializer se = StringSerializer.get(); 
MultigetSuperSliceQuery<String, String, String, String> q = me.prettyprint.hector.api.factory.HFactory 
     .createMultigetSuperSliceQuery(ch.getKeyspace(), se, se, se, se); 
// q.setSuperColumn("user1").setColumnNames("id","name") 
q.setKeys("12", "11","13", "14"); 
q.setColumnFamily(family); 
q.setRange("z", "z", false, 100); 
QueryResult<SuperRows<String, String, String, String>> r = q 
     .setColumnNames("user1", "user").execute(); 
Iterator iter = r.get().iterator(); 
while (iter.hasNext()) { 
    SuperRow superRow = (SuperRow) iter.next(); 
    SuperSlice s = superRow.getSuperSlice(); 
    List<HSuperColumn> superColumns = s.getSuperColumns(); 
    for (HSuperColumn superColumn : superColumns) { 
     List<HColumn> columns = superColumn.getColumns(); 
     System.out.println(DoubleSerializer.get().fromBytes(((String) superColumn.getSubColumnByName("salary").getValue()).getBytes())); 
    } 
} 

Vous pouvez voir 13.45 mais j'obtenir la valeur de la colonne est 13,468259733915328

Répondre

0

Vous devez briser le problème en deux. Après avoir écrit, SI vous avez défini une partie de votre schéma OU utilisé le mot-clé ASSUME sur la ligne de commande cli, regardez les données dans cassandra pour voir si elles sont correctes. PlayOrm a ce test unitaire EXACT (qui est PlayOrm au-dessus de astyanax pas hector) et cela fonctionne très bien .... Notez la comparaison dans le test de -200,23 ...

https://github.com/deanhiller/playorm/blob/master/input/javasrc/com/alvazan/test/TestColumnSlice.java

Une fois en bas , vos données dans Cassandra semblent-elles correctes? Si oui, le problème est sur votre lecture de la valeur dans le code, sinon, c'est l'écriture.

+0

Merci pour votre réponse. J'ai vérifié le résultat dans la base de données, c'est vrai. Lors de la lecture du dossier obtenir un mauvais résultat. –

Questions connexes