[問題] Cassandra kespace如何動態建立??
各位高手,想請教有何種方法解決:
自己本身有寫出利用程式將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
08/08 15:57, 1F
推
08/13 09:01, , 2F
08/13 09:01, 2F