Cassandra CQL Quick Start Guide
Cassandra CQL Quick Start Guide
Get started with HeliosDB’s Cassandra CQL protocol support. Connect using your existing CQL drivers and tools with full protocol v4/v5 compatibility.
Prerequisites
- HeliosDB server running (default CQL port: 9042)
- cqlsh or a Cassandra driver (Python, Java, Node.js)
- Basic familiarity with CQL syntax
Connection Details
| Parameter | Default Value |
|---|---|
| Host | localhost |
| Port | 9042 |
| Protocol | CQL Binary v4/v5 |
| Compression | LZ4, Snappy |
| Authentication | SASL, Password |
5-Minute Getting Started
Step 1: Connect with cqlsh
# Basic connectioncqlsh localhost 9042
# With authenticationcqlsh localhost 9042 -u admin -p passwordStep 2: Create a Keyspace
CREATE KEYSPACE my_app WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 1};
USE my_app;Step 3: Create a Table and Insert Data
CREATE TABLE users ( user_id UUID PRIMARY KEY, name TEXT, email TEXT, created_at TIMESTAMP);
INSERT INTO users (user_id, name, email, created_at)VALUES (uuid(), 'Alice', 'alice@example.com', toTimestamp(now()));Connecting with CQL Drivers
Python (cassandra-driver)
from cassandra.cluster import Clusterfrom cassandra.auth import PlainTextAuthProvider
# With authenticationauth = PlainTextAuthProvider(username='admin', password='password')cluster = Cluster(['localhost'], auth_provider=auth)session = cluster.connect('my_app')
# Execute queryrows = session.execute("SELECT * FROM users LIMIT 10")for row in rows: print(f"User: {row.name}, Email: {row.email}")
# Using prepared statementsprepared = session.prepare( "INSERT INTO users (user_id, name, email) VALUES (?, ?, ?)")session.execute(prepared, [uuid.uuid4(), 'Bob', 'bob@example.com'])Java (DataStax Driver)
import com.datastax.oss.driver.api.core.CqlSession;import java.net.InetSocketAddress;
CqlSession session = CqlSession.builder() .addContactPoint(new InetSocketAddress("localhost", 9042)) .withLocalDatacenter("datacenter1") .withKeyspace("my_app") .build();
// Execute queryResultSet rs = session.execute("SELECT * FROM users LIMIT 10");for (Row row : rs) { System.out.println("User: " + row.getString("name"));}
// Prepared statementPreparedStatement prepared = session.prepare( "INSERT INTO users (user_id, name, email) VALUES (?, ?, ?)");session.execute(prepared.bind(UUID.randomUUID(), "Charlie", "charlie@example.com"));Node.js (cassandra-driver)
const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['localhost'], localDataCenter: 'datacenter1', keyspace: 'my_app', credentials: { username: 'admin', password: 'password' }});
await client.connect();
// Execute queryconst result = await client.execute('SELECT * FROM users LIMIT 10');result.rows.forEach(row => console.log(`User: ${row.name}`));
// Prepared statementconst query = 'INSERT INTO users (user_id, name, email) VALUES (?, ?, ?)';await client.execute(query, [cassandra.types.Uuid.random(), 'Diana', 'diana@example.com'], { prepare: true });Basic CRUD Operations
CREATE (Insert)
-- Basic insertINSERT INTO users (user_id, name, email, created_at)VALUES (uuid(), 'User1', 'user1@example.com', toTimestamp(now()));
-- Insert with TTL (expires in 1 hour)INSERT INTO users (user_id, name, email)VALUES (uuid(), 'TempUser', 'temp@example.com')USING TTL 3600;
-- Conditional insert (lightweight transaction)INSERT INTO users (user_id, name, email)VALUES (550e8400-e29b-41d4-a716-446655440000, 'Unique', 'unique@example.com')IF NOT EXISTS;READ (Select)
-- Select by primary keySELECT * FROM users WHERE user_id = 550e8400-e29b-41d4-a716-446655440000;
-- Select with limitSELECT name, email FROM users LIMIT 10;
-- Select as JSONSELECT JSON * FROM users WHERE user_id = 550e8400-e29b-41d4-a716-446655440000;UPDATE
-- Basic updateUPDATE users SET email = 'newemail@example.com'WHERE user_id = 550e8400-e29b-41d4-a716-446655440000;
-- Conditional update (lightweight transaction)UPDATE users SET email = 'verified@example.com'WHERE user_id = 550e8400-e29b-41d4-a716-446655440000IF email = 'unverified@example.com';DELETE
-- Delete rowDELETE FROM users WHERE user_id = 550e8400-e29b-41d4-a716-446655440000;
-- Conditional deleteDELETE FROM users WHERE user_id = 550e8400-e29b-41d4-a716-446655440000IF EXISTS;Partition Key Design Tips
Single Partition Key
-- Good for direct lookups by userCREATE TABLE users ( user_id UUID PRIMARY KEY, name TEXT, email TEXT);Compound Partition Key (for time-series)
-- Partition by sensor and day to prevent hot spotsCREATE TABLE sensor_data ( sensor_id UUID, day DATE, reading_time TIMESTAMP, value DOUBLE, PRIMARY KEY ((sensor_id, day), reading_time)) WITH CLUSTERING ORDER BY (reading_time DESC);Best Practices
| Tip | Description |
|---|---|
| Avoid Large Partitions | Keep partitions under 100MB |
| Time Bucketing | Use day/week/month buckets for time-series |
| Avoid ALLOW FILTERING | Design schema to avoid full table scans |
| Use Clustering Columns | For sorting within partitions |
Driver Configuration Examples
Python Connection Pool
from cassandra.cluster import Clusterfrom cassandra.policies import DCAwareRoundRobinPolicy
cluster = Cluster( ['heliosdb-1', 'heliosdb-2', 'heliosdb-3'], port=9042, load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='dc1'), protocol_version=4, compression=True)session = cluster.connect('my_app')Java with Retry Policy
CqlSession session = CqlSession.builder() .addContactPoint(new InetSocketAddress("localhost", 9042)) .withLocalDatacenter("datacenter1") .withKeyspace("my_app") .withConfigLoader(DriverConfigLoader.programmaticBuilder() .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(30)) .withInt(DefaultDriverOption.CONNECTION_POOL_LOCAL_SIZE, 4) .build()) .build();Key Features
| Feature | Status | Notes |
|---|---|---|
| Binary Protocol v4/v5 | 100% | Full support |
| Prepared Statements | 100% | Full caching |
| Batch Operations | 100% | All batch types |
| TTL | 100% | Row-level expiration |
| Lightweight Transactions | 100% | IF EXISTS/IF NOT EXISTS |
| Collections | 100% | LIST, SET, MAP |
Next Steps
- Cassandra Configuration - Connection configuration
- Cassandra Compatibility - CQL v4/v5 feature compatibility
- Cassandra Examples - Advanced CQL patterns
- Protocol Compatibility Matrix - Cross-protocol comparison
Last Updated: January 2026