2011-10-11 20 views
9

Ben cassandra ve hector için yeni değilim, bu yüzden cql sorguları yürütmeye çalışıyorum ama sorun tüm sütunlar tür dizisi değil, bu yüzden dow Ben "kullanıcılardan * seçin" sorgusu yürütmek?cql sorguları java istemci hector ile cassandra dışında farklı veri almak için nasıl kullanılır

Benim sütun aile şuna benzer:

UPDATE COLUMN FAMILY users 
WITH comparator = UTF8Type 
AND key_validation_class=UTF8Type 
AND column_metadata = [ 
{column_name: full_name, validation_class: UTF8Type} 
{column_name: email, validation_class: UTF8Type} 
{column_name: state, validation_class: UTF8Type, index_type: KEYS} 
{column_name: gender, validation_class: UTF8Type} 
{column_name: birth_year, validation_class: LongType, index_type: KEYS} 
{column_name: education, validation_class: UTF8Type} 
]; 

Ben sorguyu yürütmek için şu kodu kullanın:

CqlQuery<String, String, String> cqlQuery = new CqlQuery<String, String, String>(Keyspace,stringSerializer,stringSerializer,stringSerializer); 

    cqlQuery.setQuery("select * from users"); 

    QueryResult<CqlRows<String, String, String>> result = cqlQuery.execute(); 


    if (result != null && result.get() != null) { 
     List<Row<String, String, String>> list = result.get().getList(); 
     for (Row row : list) { 
      System.out.println("."); 
      List columns = row.getColumnSlice().getColumns(); 
      for (Iterator iterator = columns.iterator(); iterator.hasNext();) { 
       HColumn column = (HColumn) iterator.next(); 
       System.out.print(column.getName() + ":" + column.getValue() 
         + "\t"); 
      } 
      System.out.println(""); 
     } 
    } 

Ama çünkü doğrulama sınıfı ile 'birth_year' sütununun

Uzun dayana Değeri al. aşağıdaki sonuç sadece bir kayıt yoktur varsayarak olsun:

KEY:Carl birth_year: 'strange chars?' full_name:Carl Smith gender:M eduction:electrician state:LA 

Bu benim sorguyu değiştirirseniz:

CqlQuery<String, String, Long> cqlQuery = new CqlQuery<String, String, Long> 
TutorialBase.tutorialKeyspace, stringSerializer, stringSerializer, longSerializer); 

    cqlQuery.setQuery("select birth_year from users"); 

çalıştığını daha.

Bunu yalnızca bir sorgu ile nasıl yapabilirim ve sütun ailesinin satırlarında boole ve float gibi daha fazla veri türü varsa ne yapabilirim?

cevap

11

Değer türünü CqlRows'da Dize olarak belirtirsiniz, böylece her değerin bir dize olması beklenir. Eğer değer tiplerini bir arada istediğimiz için, sütunun meta tutmak değil, aynı zamanda şemada BytesType olarak varsayılan doğrulama sınıfını belirlemek ve daha sonra CqlRows içinde türü olarak ByteBuffer kullanmalıdır: işlerken Sonra

QueryResult<CqlRows<String, String, ByteBuffer>> result = cqlQuery.execute(); 

değerleri, uygun tipine dönüştürmek zorunda kalacak ve bunun yerine sütunların üzerinden yineleme arasında, muhtemelen adıyla özgü sütun alacak:

ColumnSlice<String, ByteBuffer> slice = row.getColumnSlice(); 
HColumn<String,ByteBuffer> col = slice.getColumnByName("birth_year"); 
System.out.println(" birth_year: " + col.getValue().getLong()); 

tabii ki, Yaylı java kullanarak, farklı şekilde ele lazım .nio.charset.Charset:

Sütun meta verilerindeki türleri belirleyebilirsiniz, ancak bunu yalnızca Thrift API'sı aracılığıyla yaptım (bkz. ColumnDef), bu yüzden bunu Hector API aracılığıyla nasıl yapacağınızdan emin olun. Ancak HColumn, bir getValueSerializer() yöntemini sağlar, böylece bir başlangıç ​​olabilir.

+0

Merhaba libjack, tepkiniz için teşekkürler. Bunun, yalnızca bir sütun ailesindeki tüm sütunların varsayılan validasyon sınıfı olarak byteBuffer olması durumunda mümkün olduğunu mu söylüyorsunuz? İstediğim şey tam olarak bu değil çünkü cassandra'ya veri eklerken geçerli verilerin kontrolü çalışmaz. Birth_year sütununa bir dize eklemek mümkün olabilir. Kodunuzu deniyorum, ancak 'getLong()' yöntemi tanınmadı. – Rubenski

+0

Neyin yanlış olduğunu buldum: "col.getValue(). GetLong()" "column.getValueBytes() olmalıdır. GetLong()" Benim önceki soru çözüldü. Bir sütun ailesinde birden çok validation_classe olması mümkündür. – Rubenski

+0

Sağ, getLong() bir ByteBuffer yöntemidir, bu nedenle getValue() bir ByteBuffer değerini yalnızca HColumn için belirtilen tipte bir ByteBuffer döndürecektir: – libjack

İlgili konular