转载自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绑定的问题,安装命令如下:
- [root@CentOS-78 /]# pip install pycassa
手工进行安装:
手工安装较为繁琐单页非常的简单,首先要安装最新版本的thrift并确定python的版本(我们所使用的是python2.6版),安装thrift的命令如下:
- [root@CentOS-78 /]# pip install thrift
然后下载并解压pycassa软件,假定解压到了pycassa目录,则通过以下的步骤安装即可完成:
- [root@CentOS-78 /]# cd pycassa/
- [root@CentOS-78 /]# python setup.py install
二、Cassandra数据库的连接
cassandra 是分布式NoSQL数据库系统,与传统的面向行的关系数据库不同,这是一种面向列的数据库,列被成为cloumn family 增加一列是非常容易的
localhost默认连接:
该种方法将会默认以localhost:9160连接cassandra,命令如下(这里使用了python的命令行进行操作):
- >>> from pycassa.pool import ConnectionPool
- >>> pool = ConnectionPool('Keyspace1')
指定连接地址:
- >>> from pycassa.pool import ConnectionPool
- >>> pool = ConnectionPool('Keyspace1',['10.15.62.100:9160'])
- ['10.15.62.100:9160','10.15.62.101:9160','10.15.62.102:9160']
class-mapping连接:
该种连接方式在后面还会提到,主要是使用在当pycassa将column family与python的一个class对象映射到一起的时候,当然这样做主要是为了方便操作,连接命令如下:
- >>> from pycassa.pool import ConnectionPool
- >>> from pycassa.columnfamilymap import ColumnFamilyMap
- >>>
- >>> pool = ConnectionPool('Keyspace1',['10.15.62.100:9160'])
- >>> cf_map = ColumnFamilyMap(User, pool, 'users')
三、数据插入
一般插入:
- >>> col_fam.insert('row_key', {'col_name': 'col_val'})
多列插入:
- >>> col_fam.insert('row_key', {'col_name':'col_val', 'col_name2':'col_val2'})
多行插入:
- >>> col_fam.batch_insert({'row1': {'name1': 'val1', 'name2': 'val2'},
- ... 'row2': {'foo': 'bar'}})
四、计数
get_count():
- >>> col_fam.get_count('row_key')
指定相应的列或者是起点列名:
- >>> col_fam.get_count('row_key', columns=['foo', 'bar'])
- 2
- >>> col_fam.get_count('row_key', column_start='foo')
- 3
multiget_count():
- >>> col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3', 'fib4'])
- {'fib0': 1, 'fib1': 1, 'fib2': 2, 'fib3': 3, 'fib4': 5'}
- >>> col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3', 'fib4'],
- ... columns=['col1', 'col2', 'col3'])
- {'fib0': 1, 'fib1': 1, 'fib2': 2, 'fib3': 3, 'fib4': 3'}
- >>> col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3', 'fib4'],
- ... column_start='col1', column_finish='col3')
- {'fib0': 1, 'fib1': 1, 'fib2': 2, 'fib3': 3, 'fib4': 3'}
五、数据获取
1、普通column family的获取
获取一行的所有列:
- >>> col_fam.get('row_key')
- {'col_name': 'col_val', 'col_name2': 'col_val2'}
- >>> col_fam.get('row_key', columns=['col_name', 'col_name2'])
- {'col_name': 'col_val', 'col_name2': 'col_val2'}
- >>> col_fam.get('row_key', column_reversed=True, column_count=3)
- {'9': 'val', '8': 'val', '7': 'val'}
获取多行:
- >>> col_fam.multiget(['row1', 'row2'])
- {'row1': {'name1': 'val1', 'name2': 'val2'}, 'row_key2': {'foo': 'bar'}}
- >>> result = col_fam.get_range(start='row_key5', finish='row_key7')
- >>> for key, columns in result:
- ... print key, '=>', columns
- ...
- 'row_key5' => {'name':'val'}
- 'row_key6' => {'name':'val'}
- 'row_key7' => {'name':'val'}
2、获取带有super column的column family
连接cassandra数据库并创建相应的带有super column的column family:
- >>> col_fam = pycassa.ColumnFamily(pool, 'Super1')
- >>> col_fam.insert('row_key', {'supercol_name': {'col_name': 'col_val'}})
- 1354491238721345
- >>> col_fam.get('row_key')
- {'supercol_name': {'col_name': 'col_val'}}
- >>> col_fam = pycassa.ColumnFamily(pool, 'Letters')
- >>> col_fam.insert('row_key', {'super': {'a': '1', 'b': '2', 'c': '3'}})
- 1354491239132744
- >>> col_fam.get('row_key', super_column='super')
- {'supercol1': {'a': '1': 'b': '2', 'c': '3'}}
- >>> col_fam.get('row_key', super_column='super', columns=['a', 'b'])
- {'supercol1': {'a': '1': 'b': '2'}}
- >>> col_fam.get('row_key', super_column='super', column_start='b')
- {'supercol1': {'b': '1': 'c': '2'}}
- >>> col_fam.get('row_key',super_column='super',column_finish='b',column_reversed=True)
- {'supercol1': {'c': '2', 'b': '1'}}
3、获取带有CompositeType的column family
创建该种column family:
- >>> from pycassa.types import *
- >>> from pycassa.system_manager import *
- >>>
- >>> sys = SystemManager()
- >>> comparator = CompositeType(LongType(reversed=True), AsciiType())
- >>> sys.create_column_family("Keyspace1", "CF1", comparator_type=comparator)
- >>> cf = ColumnFamily(pool, "CF1")
- >>> cf.insert("key", {(1234, "abc"): "colval"})
- >>> cf.get("key")
- {(1234, "abc"): "colval"})
4、使用class-mapping方式获取数据
首先,我们要建立一个Object:
- >>> from pycassa.types import *
- >>> class User(object):
- ... key = LexicalUUIDType()
- ... name = Utf8Type()
- ... age = IntegerType()
- ... height = FloatType()
- ... score = DoubleType(default=0.0)
- ... joined = DateType()
- >>> from pycassa.pool import ConnectionPool
- >>> from pycassa.columnfamilymap import ColumnFamilyMap
- >>>
- >>> pool = ConnectionPool('Keyspace1')
- >>> cfmap = ColumnFamilyMap(User, pool, 'users')
- >>> from datetime import datetime
- >>> import uuid
- >>>
- >>> key = uuid.uuid4()
- >>>
- >>> user = User()
- >>> user.key = key
- >>> user.name = 'John'
- >>> user.age = 18
- >>> user.height = 5.9
- >>> user.joined = datetime.now()
- >>> cfmap.insert(user)
- 1261395560186855
数据获取:
- >>> user = cfmap.get(key)
- >>> user.name
- "John"
- >>> user.age
- 18
- >>> users = cfmap.multiget([key1, key2])
- >>> print users[0].name
- "John"
- >>> for user in cfmap.get_range():
- ... print user.name
- "John"
- "Bob"
- "Alex"
数据删除:
- >>> cfmap.remove(user)
- 1261395603906864
六、第二索引(Secondary Indexes)
从cassandra1.1版本开始cassandra提供了第二索引的功能,该功能够使cassandra很好的与hadoop连接实现hadoop的批量运算。我们要使用get_indexed_slice()方法通过第二索引获取到cassandra column family的数据就必须创建一个IndexClause对象,具体的方法如下:
- >>> from pycassa.pool import ConnectionPool
- >>> from pycassa.columnfamily import ColumnFamily
- >>> from pycassa.index import *
- >>> pool = ConnectionPool('Keyspace1')
- >>> users = ColumnFamily(pool, 'Users')
- >>> state_expr = create_index_expression('state', 'Utah')
- >>> bday_expr = create_index_expression('birthdate', 1970, GT)
- >>> clause = create_index_clause([state_expr, bday_expr], count=20)
- >>> for key, user in users.get_indexed_slices(clause):
- ... print user['name'] + ",", user['state'], user['birthdate']
- John Smith, Utah 1971
- Mike Scott, Utah 1980
- Jeff Bird, Utah 1973
七、API简介
以上所介绍的关于pycassa炒作cassandra数据库的操作仅仅是常用的一些操作,至于详细的其他的方法可以看考pycassa官方的API,上面有各种操作的变化版本,可以确定符合我们各种不同的应用场景,值得一提的,随着pycassa以及cassandra软件的升级,pycassa所支持的数据类型也有很大的变化,所以在进行pycassa的升级过程中一定要注意这一点。