2010-04-25 7 views
1

J'utilise Erlang pour m'interfacer avec Cassandra et je ne peux pas obtenir la commande get_slice pour retourner une liste de toutes les colonnes d'une ligne. J'utilise:Comment trouver les biens immobiliers de Cassandra avec get_slice à Erlang?

X = thrift_client:call(C, 
      'get_slice', 
      [ "Keyspace1", 
      K, 
      #columnParent{column_family="KeyValue"}, 
      #slicePredicate{}, 
      1 
      ]), 

: mais je reviens:

invalidRequestException,<<"predicate column_names and slice_range may not both be null">> 

: Cependant, en utilisant l'interface cassandra-cli cela fonctionne très bien. Des idées?

Mise à jour:

I modifié l'exemple Erlang pour refléter la Java exmaple donné:

get_props (K) -> {ok, C} = thrift_client: start_link ("127.0.0.1", 9160 , cassandra_thrift),

 S = #sliceRange{start="",finish="",reversed=false,count=100}, 
     X = thrift_client:call(C, 
       'get_slice', 
       [ "Keyspace1", 
       K, 
       #columnParent{column_family="KeyValue"}, 
       #slicePredicate{slice_range=S}, 
       1 
       ]), 
     X. 

: et cela fonctionne maintenant. Notez l'ajout de la ligne:

S = {#sliceRange start = "", finition = "", inversé = false, count = 100}

Répondre

1

Vous êtes par défaut d'initialisation de votre objet SlicePredicate. Ceci construira par défaut un SlicePredicate avec un ensemble inversé à false (comparez avec la syntaxe SQL: "ORDER by DESC"), count mis à 100 (comparez avec la syntaxe SQL: LIMIT 100) et slice_range et column_names mis à null (non spécifié dans Erlang, parce que le "manque" de null).

Espérons que mon extrait de code Java pourrait vous aider (l'exemple récupère toutes les colonnes). Je veux souligner la création et l'utilisation du SlicePredicate.

private static void get_slice(Cassandra.Client client, String keyspace, 
      byte[] userI1, ColumnParent parent) { 

     SlicePredicate predicate = new SlicePredicate(); 
     SliceRange sliceRange = new SliceRange(); 
     sliceRange.setStart(new byte[0]); 
     sliceRange.setFinish(new byte[0]); 

     predicate.setSlice_range(sliceRange); 

     List<ColumnOrSuperColumn> results = 
      client.get_slice( 
       keyspace, 
       userI1, 
       parent, 
       predicate, 
       ConsistencyLevel.ONE 
     ); 

     for (ColumnOrSuperColumn cosc : results) { 
      System.out.println("column name:  " + new String(cosc.column.name)); 
      System.out.println("column value:  " + new String(cosc.column.value)); 
      System.out.println("column timestamp: " + cosc.column.timestamp); 
     } 
    } 
+0

Merci. J'ai mis à jour la question. Quoi qu'il en soit, je l'ai encore essayé mais ça ne marche toujours pas. – Zubair

+0

timeout ... combien de colonnes (pour la clé 'K') comptez-vous récupérer? des millions? – Schildmeijer

+0

2 colonnes. En cassandra-cli je reviens: cassandra> obtenir Keyspace1.KeyValue ['name'] => (colonne = valeur, valeur = zubair2, horodatage = 1) => (colonne = utilisateur, valeur = racine, horodatage = 1272193083806000) – Zubair