[問題] Cassandra kespace如何動態建立??

看板java作者 (假嗨)時間12年前 (2013/08/08 15:56), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
各位高手,想請教有何種方法解決: 自己本身有寫出利用程式將Excel的內容自動插入Cassandra資料庫內 但是,後來卻想到了一些問題。將Excel內容插入Cassandra資料庫之前 都要事先在終端機上下cassandra-cli指令進入資料庫, 然後create keyspace 名稱;再來create column family 名稱; 雖然這樣可以解決我先前的問題,卻發現今天如果有100 case,每個case 都要不同的keyspace和column family的話,就必須要終端機下重複100 次create的指令,這樣造成好多不必要的麻煩。所以就想到何不藉由程式 來自動創建??在執行資料插入前,先問使用者keyspace和column family 然後建立這兩項名稱在資料庫內,確定建立後再執行資料插入的動作。 目前有寫出一些程式碼,但執行時候出現了問題,想問看看是否有人有更 好的解決方法?? P.S:自己以Excel的使用方式來解讀keyspace和colum family的用義 1.keyspace:這裡的名稱代表一個檔案(file)的名稱 2.column family:這裡的名稱代表檔案裡的表單(table)名稱 不論如何在插入資料前都要建出檔案,才能插入資料(廢話~ =.=a) ---------------------------------程式碼如下(片段)---------------------------- 1 public class cassandraWriteData2 { 2 3 //cassandra DB 連線參數設定 4 private static final String CASSANDRA_HOST = "localhost"; 5 private static final int CASSANDRA_PORT = 9160; 6 7 //先設定keyspace name 8 private static final String CASSANDRA_KEYSPACE = "keyspace1"; 9 10 //設定編碼方式 11 private static final String CHARSET = "UTF-8"; 12 13 /** 14 * @param args 15 */ 16 public static void main(String[] args) { 17 // TODO Auto-generated method stub 18 //cassandra DB 連線 19 TTransport transport = new TFramedTransport(new TSocket(CASSANDRA_HOST, CASSANDRA_PORT)); 20 TProtocol protocol = new TBinaryProtocol(transport); 21 Cassandra.Client client = new Cassandra.Client(protocol); 22 23 try { 24 transport.open(); 25 26 //Drop existing keyspace, if already exists (be careful, as it throws an exception.) 27 //刪除cassandra DB內已存在相同的Keyspace 28 client.system_drop_keyspace(CASSANDRA_KEYSPACE); 29 30 //set column family name 31 String authorsColumnFamilyName = "Authors"; 32 33 //Since this is Apache Cassandra greater than 0.7, create our own keyspace 34 //建立自己想要的keyspace; 35 //利用KsDef來實現 36 KsDef keyspaceDefinition = new KsDef(); 37 keyspaceDefinition.name = CASSANDRA_KEYSPACE; 38 keyspaceDefinition.strategy_class = SimpleStrategy.class.getName(); 39 keyspaceDefinition.setReplication_factorIsSet(true); 40 41 //Now, create a column family definition 42 //建立自己想要的column family name; 43 //利用CfDef來實現; CfDef [變數名稱] = new CfDef([keyspace],[column family]); 44 CfDef authorsCfDefinition = new CfDef(CASSANDRA_KEYSPACE, authorsColumnFamilyName); 45 46 //設定column family的編碼(排)方法 47 authorsCfDefinition.comparator_type = "UTF8Type"; 48 49 //建立三個column field,分別為:title、url、views,並設定編碼方式 50 ColumnDef titleColumnDefinition = new ColumnDef(ByteBuffer.wrap("title".getBytes(CHARSET)), "UTF8Type"); 51 ColumnDef urlColumnDefinition = new ColumnDef(ByteBuffer.wrap("url".getBytes(CHARSET)), "UTF8Type"); 52 ColumnDef viewsColumnDefinition = new ColumnDef(ByteBuffer.wrap("views".getBytes(CHARSET)), "LongType"); 53 54 //設定index_type類型 55 viewsColumnDefinition.index_type = IndexType.KEYS; 56 57 //Add ColumnDef to CfDef 58 //將建立的column field insert 59 authorsCfDefinition.addToColumn_metadata(titleColumnDefinition); 60 authorsCfDefinition.addToColumn_metadata(urlColumnDefinition); 61 authorsCfDefinition.addToColumn_metadata(viewsColumnDefinition); //Set CfDefs to KsDef //再將CfDefs型態轉成KsDef keyspaceDefinition.cf_defs = Arrays.asList(authorsCfDefinition); //Now, let Cassandra create our new Keyspace with the KsDef we defined. //使用我們轉好的KsDef來創建 keyspace client.system_add_keyspace(keyspaceDefinition); //Now, we need to be in keyspace, just like in Cassandra-CLI "USE <keyspace>" command. //實現Cassandra-CLI的use指令來取得keyspace client.set_keyspace(CASSANDRA_KEYSPACE); //Now, let's begin //We need the now factor long now = System.currentTimeMillis(); //Create a Column Family called "Author" //進入keyspace後,開始創建我們訂的column family ColumnParent columnParent = new ColumnParent(authorsColumnFamilyName); --------------------------------------Debug資訊------------------------------- InvalidRequestException(why:Cannot drop non existing keyspace 'keyspace1'.) at org.apache.cassandra.thrift.Cassandra$system_drop_keyspace_result.read(Cassandra.java:33956) at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) at org.apache.cassandra.thrift.Cassandra$Client.recv_system_drop_keyspace(Cassandra.java:1437) at org.apache.cassandra.thrift.Cassandra$Client.system_drop_keyspace(Cassandra.java:1424) at com.nuk.cassandra.cassandraWriteData2.main(cassandraWriteData2.java:60) -------------------------------------問題--------------------------------------- 文中程式碼的28行,就是Debug資訊的60行。它說無法刪除現有的密鑰空間 1. 我有試過將程式碼第8行的"keyspace1"改成別的,如:"keyspace100"也是同樣說法 原先以為有問題是因為我先前有先透過終端機方式建立了keyspace1(重複??)所以才造成 的問題,後來改成keyspace100之前,有先去檢查資料庫有無存在相同的名稱,也確定沒 有,為何依舊有這樣的問題存在???以及28行的功能是先刪除資料庫內的相同的名稱,然後 再將自訂的keyspace創建,有人知道這樣的問題是出在哪嗎??? 2. KsDef和CfDef的用法我目前還是不太懂,若可以的話請簡單跟說我一下用法是如何?? 若是我用法有錯也請指正我用法,並提點我如何正確使用? 3. 目前有去看網路上cassandra-jdbc的用法,但是我對jdbc很陌生..........Q^Q 若是有知道cassandra-jdbc的用法或教法請讓我參考一下 補充:關於第一點的密鑰空間 在終端機建立keyspace 和column family時,cassandra系統都會將名稱轉成系統的 編制方式(二進制編碼?????),如: user@default] create key space Hello;→2e3f5ab95de6。 user@default] use Hello user@Hello] create column family Test→3b4e5d9f9c9ab4 不知道是否是因為系統必須先(Hello、Test)轉成看得懂的編碼,才造成不能透過程式 來創建keyspace和column family? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.127.218.63

08/08 15:57, , 1F
標題少打一個英文字,抱歉!! keyspace
08/08 15:57, 1F

08/13 09:01, , 2F
應該先把 100 個 case 一般化成一個 case (如果可能的話)
08/13 09:01, 2F
文章代碼(AID): #1I0qyvJR (java)