2012-06-19 4 views
3

Est-il possible d'utiliser Hector ou Astyanax pour obtenir des lignes par des clés composites (dans plusieurs colonnes, pas celles sérialisées dans une colonne)?cassandra 1.1.x get by composite key

Dans cqlsh i créé la famille de la colonne simple:

CREATE COLUMNFAMILY kkvv (x int, y int, val1 varchar, val2 varchar, PRIMARY KEY (x,y)); 

Selon Cassandra Developer Center les lignes sont stockées par x comme clé et de repos sont stockées dans des colonnes.

Je ne peux pas comprendre comment obtenir des tranches de colonnes pour x et y donnés.

exécution cql en hector que CQL

cqlQuery.setQuery("select * from kkvv") 

me donne rangées:

rangée (2, ColumnSlice ([HColumn (x = 2)]))

rangée (10 , ColumnSlice ([HColumn (x = 10)]))

et cqlsh console donne:

x | y | val1 | val2

---- + ----- + ------- + -----------

2 | 1 | v1_1 | v2_1

10 | 27 | v1_4b | v2_4b

10 | 91 | v1_4a | v2_4a

Quelqu'un a réussi à le faire dans n'importe quel client cassandra pour Java? Puis-je utiliser thrift pour cela, ou c'est seulement fonctionnalité cql?

Répondre

0

Bonne explication de la façon dont les lignes avec des clés composées sont stockées dans Cassandra est here.

Dans Astyanax et Hector j'ai remarqué chose drôle - quand un essayé de se connecter - il a utilisé CQL2.Quand je me connectais à Cassandra avec CQL3 avec cassandra api (code de l'exemple ci-dessous), quelque part était stocké ce paramètre, après qu'Astyanax et Hector utilisaient cql3 au lieu de CQL2. Les connexions ont été faites en tant qu'exécutions séparées, donc il ne pouvait pas être stocké du côté client ... Quelqu'un a des pensées à ce sujet?

La version CQL peut être définie sur org.apache.cassandra.thrift.Cassandra.Client avec la méthode set_cql_version.

Si quelqu'un est intéressé par exemple de travail en utilisant api pur Cassandra:

import java.io.UnsupportedEncodingException; 
import java.nio.ByteBuffer; 
import java.util.List; 

import org.apache.cassandra.thrift.Cassandra; 
import org.apache.cassandra.thrift.Column; 
import org.apache.cassandra.thrift.Compression; 
import org.apache.cassandra.thrift.CqlResult; 
import org.apache.cassandra.thrift.CqlRow; 
import org.apache.cassandra.thrift.InvalidRequestException; 
import org.apache.cassandra.thrift.SchemaDisagreementException; 
import org.apache.cassandra.thrift.TimedOutException; 
import org.apache.cassandra.thrift.UnavailableException; 
import org.apache.thrift.TException; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.protocol.TProtocol; 
import org.apache.thrift.transport.TFramedTransport; 
import org.apache.thrift.transport.TSocket; 
import org.apache.thrift.transport.TTransport; 

public class KKVVGetter { 
    private static Cassandra.Client client; 
    private static TTransport  transport; 

    public static void main(String[] args) throws UnsupportedEncodingException, InvalidRequestException, 
      UnavailableException, TimedOutException, SchemaDisagreementException, TException { 

     transport = new TFramedTransport(new TSocket("localhost", 9160)); 
     TProtocol protocol = new TBinaryProtocol(transport); 
     client = new Cassandra.Client(protocol);   
     transport.open(); 
     client.set_cql_version("3.0.0"); 

     executeQuery("USE ks_test3"); 

     show("select x,y,val1,val2 from kkvv where x > 1 and x < 11 and y < 100 and y > 2"); 

     System.out.println("\n\n*****************************\n\n"); 

     show("select x,y,val1,val2 from kkvv"); 

     transport.close(); 
    } 

    private static int toInt(byte[] bytes) { 
     int result = 0; 
     for (int i = 0; i < 4; i++) { 
      result = (result << 4) + (int) bytes[i]; 
     } 
     return result; 
    } 

    private static CqlResult executeQuery(String query) throws UnsupportedEncodingException, InvalidRequestException, 
      UnavailableException, TimedOutException, SchemaDisagreementException, TException { 
     return client.execute_cql_query(ByteBuffer.wrap(query.getBytes("UTF-8")), Compression.NONE); 
    } 

    private static void show(String query) throws UnsupportedEncodingException, InvalidRequestException, 
      UnavailableException, TimedOutException, SchemaDisagreementException, TException { 
     CqlResult result = executeQuery(query); 
     List<CqlRow> rows = result.getRows(); 
     System.out.println("rows: " + rows.size()); 
     for (CqlRow row : rows) { 
      System.out.println("columns: " + row.getColumnsSize()); 
      for (Column c : row.getColumns()) { 
       System.out.print(" " + new String(c.getName())); 
       switch (new String(c.getName())) { 
        case "x": 
        case "y": 
         System.out.print(" " + toInt(c.getValue())); 
         break; 
        case "val1": 
        case "val2": 
         System.out.print(" " + new String(c.getValue())); 
         break; 

        default: 
         break; 
       } 
       System.out.println(); 
      } 
     } 
    } 
} 

Exemple pour le schéma en question.

0

Il existe deux syntaxes quelque peu différentes ici: CQL 2 et CQL 3. Par défaut, une connexion Cassandra attend CQL 2. CQL 2, cependant, ne comprend pas les familles de colonnes de clés composées du type que vous avez fait ici.

Donc, vous utilisez apparemment correctement CQL 3 avec cqlsh, car il affiche vos colonnes de manière sensée, mais vous ne l'utilisez pas avec Hector. Je ne suis pas sûr si Hector ou Astyanax même le supportent encore. La dernière version du pilote cassandra-jdbc le fait donc, si Hector et/ou Astyanax l'utilisent, alors ils devraient aussi fonctionner. Thibft n'est pas (et ne sera probablement pas) supporté par Thrift pour traiter les familles de colonnes à comparateur composite comme des tables avec des clés primaires à plusieurs composants, comme le fait CQL 3. Utilisez CQL 3 si vous le souhaitez.

+0

Je me demande comment et si je peux utiliser des touches composites avec le chargeur de bulkloader fourni pour hadoop !? – jonbros

+0

Je l'ai vérifié, c'est comme Vous l'avez dit. En outre, il est possible d'utiliser Astyanax ou Hector, mais vous devez aler code source à appliquer en utilisant cql3. – trj

Questions connexes