2012-06-19 66 views
3

是否有可能使用Hector或Astyanax通過組合鍵獲取行(在多列中,而不是序列化爲一列的行)?cassandra 1.1.x通過組合鍵得到

在cqlsh我創建簡單列族:

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

根據Cassandra Developer Center行由X存儲爲一個鍵和其餘部分被存儲在列。

我不能'如何爲給定的x和y獲得列分片。

在赫執行CQL該CQL

cqlQuery.setQuery("select * from kkvv") 

給我行:

行(2,ColumnSlice([HColumn(X = 2)]))

行(10 ,ColumnSlice([HColumn(x = 10)]))

和控制檯cqlsh給出:

x | y | val1 | val2

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

2 | 1 | v1_1 | v2_1

10 | 27 | v1_4b | v2_4b

10 | 91 | v1_4a | v2_4a

任何人都設法在java的任何cassandra客戶端中做到這一點? 我可以使用節儉嗎,還是隻有cql功能?

回答

0

很好的解釋如何在Cassandra中存儲具有複合鍵的行是here

在Astyanax和Hector中,我注意到有趣的事情 - 當試圖連接時 - 它使用CQL2。當我用Cassandra API(來自示例波紋管的代碼)通過CQL3連接到Cassandra時,某處存儲了此設置,此後Astyanax和Hector使用cql3而不是CQL2。連接是作爲單獨的執行,因此它不能存儲在客戶端...有人對此有任何想法?

可以使用set_cql_version方法在org.apache.cassandra.thrift.Cassandra.Client上設置CQL版本。

如果有人有興趣使用純卡桑德拉API的使用例子:

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(); 
      } 
     } 
    } 
} 

示例有問題的模式。

0

在這裏有兩個有點不同的語法:CQL 2和CQL 3.默認情況下,Cassandra連接期望CQL 2.然而,CQL 2並不理解你製作的排序的組合鍵列這裏。

所以,你顯然正確地使用CQL 3與cqlsh,因爲它以一種理智的方式顯示你的列,但你並沒有使用它與赫克託。我不確定Hector或Astyanax是否還支持。最新版本的cassandra-jdbc驅動程序確實如此,如果Hector和/或Astyanax使用它,那麼它們也應該工作。

在Thrift中沒有(也可能不會)支持複合比較器列家族作爲具有多組件主鍵的表,這是CQL 3執行的方式。如果你想要的話,使用CQL 3。

+0

我不知道如何以及如果我能夠使用散裝加載程序可寫的組合鍵爲hadoop提供! – jonbros

+0

我查過了,就像你說的。另外,可以使用Astyanax或Hector,但您必須使用cql3來執行源代碼。 – trj