作者brandonron (假嗨)
看板java
标题[问题] Cassandra kespace如何动态建立??
时间Thu Aug 8 15:56:38 2013
各位高手,想请教有何种方法解决:
自己本身有写出利用程式将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
1F:→ brandonron:标题少打一个英文字,抱歉!! keyspace 08/08 15:57
2F:推 qrtt1:应该先把 100 个 case 一般化成一个 case (如果可能的话) 08/13 09:01