Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cassandra for Pythonistas
Search
Sébastien Béal
September 14, 2013
Programming
1
82
Cassandra for Pythonistas
Talk given at PyCon APAC 2013 on Cassandra drivers for Python with a focus on cassandra-driver.
Sébastien Béal
September 14, 2013
Tweet
Share
Other Decks in Programming
See All in Programming
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
140
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
290
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
140
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
190
AIコーディングエージェント(Gemini)
kondai24
0
280
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
340
GISエンジニアから見たLINKSデータ
nokonoko1203
0
180
AIエージェントの設計で注意するべきポイント6選
har1101
5
2.3k
ゆくKotlin くるRust
exoego
1
160
tparseでgo testの出力を見やすくする
utgwkk
2
280
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3k
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
0
39
Fireside Chat
paigeccino
41
3.8k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
17
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
260
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
140
What's in a price? How to price your products and services
michaelherold
246
13k
Designing for Performance
lara
610
69k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
980
Transcript
Cassandra for Pythonistas Sébastien Béal PyCon APAC 2013 09/14/2013
Cassandra for Pythonistas Humans ...or not
whoami locarise sebastibe @gmail.com CEO and Co-Founder @ in Tokyo
2009-2012
Why Cassandra? Connect all the things!
Distributed column-based key- value store (schema optional) Released 2.0 on
September 3rd BigTable Dynamo 2009
Architecture Cluster Node Seed Seed Ring Gossip Snitch
Other Features • Partitioner • Data replication: ‣ Simple Strategy
(1 datacenter) ‣ Network Topology Strategy • Compaction
Data Model keyspace column family column family row row row
column column column row row row row super column super column super column super column column column column column
Data Model column family = {row key: {column name: value}
} column family = {row key: {super column name: {column name: value} } }
Composite column family = {(key1, key2): {(name1, name2): value} }
composite key composite column name
Communication • Thrift • Cassandra Query Language (CQL) • CQL
2 • CQL 3 (Cassandra 1.2.x) • CQL 3.1 (Cassandra 2.0+)
None
Cassandra & Python
Python Packages • Pycassa (Thrift) • Telephus (Thrift, twisted) •
Silverberg (CQL, twisted) • cassandra-dbapi2 (CQL, PEP249) • cassandra-driver (CQL3, libev)
Python 3 http://python3wos.appspot.com/
cassandra driver • Released in August 2013 • Designed for
CQL • Replacement for Pycassa Still in Beta!
CQL • “Denormalized SQL” ‣ No joins ‣ No sub-queries
‣ No aggregation ‣ Limited ORDER BY
Keyspace from cassandra.cluster import Cluster cluster = Cluster() session =
cluster.connect() session.execute("CREATE KEYSPACE Keyspace WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 1};") session.set_keyspace("Keyspace")
Column Family session.execute("CREATE TABLE users (" "username varchar," "gender varchar,"
"session_token varchar," "birth_year bigint," "PRIMARY KEY (user_name));")
Prepared Statement query = "INSERT INTO users (username, gender, birth_year)
VALUES (?, ?, ?)" prepared = session.prepare(query) session.execute(prepared.bind(('seb', 'M', 1984)))
Prepared Statement from cassandra.query import ValueSequence users = ('alice', 'bob',
'seb') query = "SELECT * FROM users WHERE user_id IN ?" session.execute(query, parameters=[ValueSequence(users)])
Decoder session.execute("SELECT * FROM users") # [Row(username=u'seb', birth_year=1984, gender=u'M', session_token=None)]
from cassandra.decoder import ordered_dict_factory session.row_factory = ordered_dict_factory session.execute("SELECT * FROM users") # [OrderedDict([(u'user_name', u'seb'), ( u'birth_year', 1984), (u'gender', u'M'), (u'session_token', None)])]
Async Calls future = session.execute_async("SELECT * FROM users") def print_results(results):
for row in results: print "Results: %s" % row def print_error(exc): print "Operation failed: %s" % exc future.add_callbacks(print_results, print_error) # Results: Row(user_name=u'seb', birth_year=1984, gender=u'M', session_token=None)
Pluggable Async from cassandra.io.libevreactor import LibevConnection cluster.connection_class = LibevConnection session
= cluster.connect()
Lessons Learned • CQL vs Thrift / C* vocabulary •
Row size limit: row sharding • Opscenter for supervising
Time Series Data CREATE TABLE temperature ( sensor_id varchar, ts
timestamp, temperature float, PRIMARY KEY (sensor_id, ts)); compound primary key (partition key, clustering key)
Time Series Data CREATE TABLE temperature_by_day ( sensor_id varchar, date
text, ts timestamp, temperature float, PRIMARY KEY ((sensor_id, date), ts) ) WITH CLUSTERING ORDER BY (ts DESC); reverse order composite partition key
Questions?