Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
CSC307 Lecture 03
javiergs
PRO
1
490
Patterns of Patterns
denyspoltorak
0
1.4k
Architectural Extensions
denyspoltorak
0
280
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
20
6.9k
AtCoder Conference 2025
shindannin
0
1k
ぼくの開発環境2026
yuzneri
0
140
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
600
Oxlintはいいぞ
yug1224
5
1.3k
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
5
340
AI時代の認知負荷との向き合い方
optfit
0
150
CSC307 Lecture 05
javiergs
PRO
0
500
高速開発のためのコード整理術
sutetotanuki
1
390
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
For a Future-Friendly Web
brad_frost
182
10k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
250
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
300
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
410
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
140
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
The SEO Collaboration Effect
kristinabergwall1
0
350
Utilizing Notion as your number one productivity tool
mfonobong
3
220
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?