使用pycassa 在cassandra中存取数据

转载自Andy_YF 的blog原文是http://blog.csdn.net/andy_yf/article/details/7830843   写的不错,比看我英文文档好多了。

pycassa 1.7官方文档:http://pycassa.github.com/pycassa/index.html

cql在命令行中读写数据库: http://cassandra.apache.org/doc/cql3/CQL.html

一、背景

1、pycassa安装

pip工具进行安装:

如果系统安装有pip工具的话,通过该工具安装非常的便捷,并且该工具能够自动的解决pycassa相对应的Thrift python绑定的问题,安装命令如下:

  1. [root@CentOS-78 /]# pip install pycassa  

手工进行安装:

手工安装较为繁琐单页非常的简单,首先要安装最新版本的thrift并确定python的版本(我们所使用的是python2.6版),安装thrift的命令如下:

  1. [root@CentOS-78 /]# pip install thrift  
当然,thrift也可以以其他的方式安装,具体请参考thrift的相关文档。

然后下载并解压pycassa软件,假定解压到了pycassa目录,则通过以下的步骤安装即可完成:

  1. [root@CentOS-78 /]# cd pycassa/  
  2. [root@CentOS-78 /]# python setup.py install  

二、Cassandra数据库的连接

cassandra 是分布式NoSQL数据库系统,与传统的面向行的关系数据库不同,这是一种面向列的数据库,列被成为cloumn family 增加一列是非常容易的

localhost默认连接:

该种方法将会默认以localhost:9160连接cassandra,命令如下(这里使用了python的命令行进行操作):

  1. >>> from pycassa.pool import ConnectionPool  
  2. >>> pool = ConnectionPool('Keyspace1')  

指定连接地址:

  1. >>> from pycassa.pool import ConnectionPool  
  2. >>> pool = ConnectionPool('Keyspace1',['10.15.62.100:9160'])  
如果cassandra的服务不止一台服务器(通常都是这样的),那么在cassandra的地址中可以如下的添加:
  1. ['10.15.62.100:9160','10.15.62.101:9160','10.15.62.102:9160']  

class-mapping连接:

该种连接方式在后面还会提到,主要是使用在当pycassa将column family与python的一个class对象映射到一起的时候,当然这样做主要是为了方便操作,连接命令如下:

  1. >>> from pycassa.pool import ConnectionPool  
  2. >>> from pycassa.columnfamilymap import ColumnFamilyMap  
  3. >>>   
  4. >>> pool = ConnectionPool('Keyspace1',['10.15.62.100:9160'])  
  5. >>> cf_map = ColumnFamilyMap(User, pool, 'users')  
其中User为class对象,users为column family的名字。

三、数据插入

一般插入:

  1. >>> col_fam.insert('row_key', {'col_name': 'col_val'})  
row_key是行健值,col_name是该行对应的一个列名,当然col_val即为该列对应的value了。

多列插入:

  1. >>> col_fam.insert('row_key', {'col_name':'col_val', 'col_name2':'col_val2'})  

多行插入:

  1. >>> col_fam.batch_insert({'row1': {'name1': 'val1', 'name2': 'val2'},  
  2. ...                       'row2': {'foo': 'bar'}})  

四、计数

get_count():

  1. >>> col_fam.get_count('row_key')  

指定相应的列或者是起点列名:

  1. >>> col_fam.get_count('row_key', columns=['foo', 'bar'])  
  2. 2  
  3. >>> col_fam.get_count('row_key', column_start='foo')  
  4. 3  

multiget_count():

  1. >>> col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3', 'fib4'])  
  2. {'fib0': 1, 'fib1': 1, 'fib2': 2, 'fib3': 3, 'fib4': 5'}  
  3. >>> col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3', 'fib4'],  
  4. ...                        columns=['col1', 'col2', 'col3'])  
  5. {'fib0': 1, 'fib1': 1, 'fib2': 2, 'fib3': 3, 'fib4': 3'}  
  6. >>> col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3', 'fib4'],  
  7. ...                        column_start='col1', column_finish='col3')  
  8. {'fib0': 1, 'fib1': 1, 'fib2': 2, 'fib3': 3, 'fib4': 3'}  

五、数据获取

1、普通column family的获取

获取一行的所有列:

  1. >>> col_fam.get('row_key')  
  2. {'col_name': 'col_val', 'col_name2': 'col_val2'}  
获取一行的指定列:
  1. >>> col_fam.get('row_key', columns=['col_name', 'col_name2'])  
  2. {'col_name': 'col_val', 'col_name2': 'col_val2'}  
获取一行的最后n列:
  1. >>> col_fam.get('row_key', column_reversed=True, column_count=3)  
  2. {'9': 'val', '8': 'val', '7': 'val'}  
这里column_resersed定为True是指按照反序的方式获取。

获取多行:

  1. >>> col_fam.multiget(['row1', 'row2'])  
  2. {'row1': {'name1': 'val1', 'name2': 'val2'}, 'row_key2': {'foo': 'bar'}}  
指定起止列名的方式获取多列:
  1. >>> result = col_fam.get_range(start='row_key5', finish='row_key7')  
  2. >>> for key, columns in result:  
  3. ...     print key, '=>', columns  
  4. ...  
  5. 'row_key5' => {'name':'val'}  
  6. 'row_key6' => {'name':'val'}  
  7. 'row_key7' => {'name':'val'}  

2、获取带有super column的column family

连接cassandra数据库并创建相应的带有super column的column family:

  1. >>> col_fam = pycassa.ColumnFamily(pool, 'Super1')  
  2. >>> col_fam.insert('row_key', {'supercol_name': {'col_name': 'col_val'}})  
  3. 1354491238721345  
  4. >>> col_fam.get('row_key')  
  5. {'supercol_name': {'col_name': 'col_val'}}  
各种获取该种column family值的方法:
  1. >>> col_fam = pycassa.ColumnFamily(pool, 'Letters')  
  2. >>> col_fam.insert('row_key', {'super': {'a': '1', 'b': '2', 'c': '3'}})  
  3. 1354491239132744  
  4. >>> col_fam.get('row_key', super_column='super')  
  5. {'supercol1': {'a': '1': 'b': '2', 'c': '3'}}  
  6. >>> col_fam.get('row_key', super_column='super', columns=['a', 'b'])  
  7. {'supercol1': {'a': '1': 'b': '2'}}  
  8. >>> col_fam.get('row_key', super_column='super', column_start='b')  
  9. {'supercol1': {'b': '1': 'c': '2'}}  
  10. >>> col_fam.get('row_key',super_column='super',column_finish='b',column_reversed=True)  
  11. {'supercol1': {'c': '2', 'b': '1'}}  

3、获取带有CompositeType的column family

创建该种column family:

  1. >>> from pycassa.types import *  
  2. >>> from pycassa.system_manager import *  
  3. >>>  
  4. >>> sys = SystemManager()  
  5. >>> comparator = CompositeType(LongType(reversed=True), AsciiType())  
  6. >>> sys.create_column_family("Keyspace1", "CF1", comparator_type=comparator)  
插入数据:
  1. >>> cf = ColumnFamily(pool, "CF1")  
  2. >>> cf.insert("key", {(1234, "abc"): "colval"})  
获取数据:
  1. >>> cf.get("key")  
  2. {(1234, "abc"): "colval"})  

4、使用class-mapping方式获取数据

首先,我们要建立一个Object:

  1. >>> from pycassa.types import *  
  2. >>> class User(object):  
  3. ...     key = LexicalUUIDType()  
  4. ...     name = Utf8Type()  
  5. ...     age = IntegerType()  
  6. ...     height = FloatType()  
  7. ...     score = DoubleType(default=0.0)  
  8. ...     joined = DateType()  
数据库的连接操作(前面已经提过):
  1. >>> from pycassa.pool import ConnectionPool  
  2. >>> from pycassa.columnfamilymap import ColumnFamilyMap  
  3. >>>  
  4. >>> pool = ConnectionPool('Keyspace1')  
  5. >>> cfmap = ColumnFamilyMap(User, pool, 'users')  
数据插入:
  1. >>> from datetime import datetime  
  2. >>> import uuid  
  3. >>>  
  4. >>> key = uuid.uuid4()  
  5. >>>  
  6. >>> user = User()  
  7. >>> user.key = key  
  8. >>> user.name = 'John'  
  9. >>> user.age = 18  
  10. >>> user.height = 5.9  
  11. >>> user.joined = datetime.now()  
  12. >>> cfmap.insert(user)  
  13. 1261395560186855  

数据获取:

  1. >>> user = cfmap.get(key)  
  2. >>> user.name  
  3. "John"  
  4. >>> user.age  
  5. 18  
  6. >>> users = cfmap.multiget([key1, key2])  
  7. >>> print users[0].name  
  8. "John"  
  9. >>> for user in cfmap.get_range():  
  10. ...    print user.name  
  11. "John"  
  12. "Bob"  
  13. "Alex"  

数据删除:

  1. >>> cfmap.remove(user)  
  2. 1261395603906864  

六、第二索引(Secondary Indexes)

从cassandra1.1版本开始cassandra提供了第二索引的功能,该功能够使cassandra很好的与hadoop连接实现hadoop的批量运算。我们要使用get_indexed_slice()方法通过第二索引获取到cassandra column family的数据就必须创建一个IndexClause对象,具体的方法如下:

  1. >>> from pycassa.pool import ConnectionPool  
  2. >>> from pycassa.columnfamily import ColumnFamily  
  3. >>> from pycassa.index import *  
  4. >>> pool = ConnectionPool('Keyspace1')  
  5. >>> users = ColumnFamily(pool, 'Users')  
  6. >>> state_expr = create_index_expression('state', 'Utah')  
  7. >>> bday_expr = create_index_expression('birthdate', 1970, GT)  
  8. >>> clause = create_index_clause([state_expr, bday_expr], count=20)  
  9. >>> for key, user in users.get_indexed_slices(clause):  
  10. ...     print user['name'] + ",", user['state'], user['birthdate']  
  11. John Smith, Utah 1971  
  12. Mike Scott, Utah 1980  
  13. Jeff Bird, Utah 1973  

七、API简介

以上所介绍的关于pycassa炒作cassandra数据库的操作仅仅是常用的一些操作,至于详细的其他的方法可以看考pycassa官方的API,上面有各种操作的变化版本,可以确定符合我们各种不同的应用场景,值得一提的,随着pycassa以及cassandra软件的升级,pycassa所支持的数据类型也有很大的变化,所以在进行pycassa的升级过程中一定要注意这一点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值