Learn Bigtable emulator features

Bigtable Emulator Coverage

This page documents the feature coverage of LocalCloud’s extended Bigtable emulator (bigtable-emulator-extended), which adds persistence, change streams, continuous materialized views, and additional Admin API support on top of the upstream Google Cloud Bigtable emulator.

The emulator is compatible with standard Bigtable SDKs via the BIGTABLE_EMULATOR_HOST environment variable.

Support legend

StatusMeaning
SupportedProvides functional and API parity to Bigtable production capabilities.
Supported*Exposes and accepts the API but may not enforce behavior (e.g., IAM stubs, metadata-only backups).
Not supportedUnsupported, cloud-only, outside emulator scope, or returns Unimplemented.

Support summary

AreaStatusWhat this means for developers
Data API (reads and writes)SupportedReadRows, MutateRow, MutateRows, CheckAndMutateRow, ReadModifyWriteRow, and SampleRowKeys execute locally with full filter and mutation support.
Read filtersSupportedAll 17 filter types including composite (chain, interleave, condition), regex, range, limiting, and transformer filters.
Table Admin APISupportedTable CRUD, column family management with GC rules, DropRowRange, consistency tokens, and deletion protection.
Instance Admin APISupportedInstance, cluster, and app profile CRUD with cascading deletes and partial updates.
Change streamsSupportedSingle-partition streaming with continuation tokens, start-time filtering, and heartbeats.
Continuous materialized viewsSupportedWrite-time re-keying with automatic shadow table creation and propagation. LocalCloud-extended feature.
BackupsSupported*Full CRUD and CopyBackup for metadata. RestoreTable creates table with schema but no data restore.
Authorized and logical viewsSupported*Metadata CRUD works. No access enforcement on reads/writes.
IAMSupported*Permissive stubs — GetIamPolicy, SetIamPolicy, and TestIamPermissions always succeed.
PersistenceSupportedSQLite3 (default) or PostgreSQL backends. All entities persist across restarts.
GoogleSQL for BigtableNot supportedPrepareQuery and ExecuteQuery return Unimplemented.
Replication and multi-clusterNot supportedSingle-process emulator. No replication, failover, or multi-cluster consistency.

Data API

AreaStatusCoveredLimits
ReadRowsSupportedStreaming reads with full filter pipeline, row key ranges, row key sets, and multiple row ranges.No read throttling or quota enforcement.
MutateRowSupportedAtomic single-row mutations: SetCell, DeleteFromColumn, DeleteFromFamily, DeleteFromRow.No server-side timestamp assignment differences from production.
MutateRowsSupportedStreaming batch mutations with per-entry error reporting and status codes.No batch size limits enforced.
CheckAndMutateRowSupportedPredicate-based conditional mutations with true/false mutation branches.No production-grade atomicity guarantees in concurrent scenarios.
ReadModifyWriteRowSupportedAtomic increment (AddToCell for int64 sum) and append operations.Only int64 sum aggregation supported. HyperLogLog and other aggregate types return raw input unchanged.
SampleRowKeysSupportedReturns approximate row key samples for partitioning.Sampling is approximate; no production-grade distribution guarantees.
PingAndWarmSupportedNo-op, always succeeds.
PrepareQueryNot supportedReturns Unimplemented.GoogleSQL for Bigtable not supported.
ExecuteQueryNot supportedReturns Unimplemented.GoogleSQL for Bigtable not supported.

Read filters

FilterStatusBehaviorLimits
ChainSupportedApplies multiple filters in sequence, each filtering the output of the previous.
InterleaveSupportedUnion of filter results with deduplication of matching cells.
ConditionSupportedIf/then/else branching — applies true or false filter based on predicate match.
BlockAllFilterSupportedDrops all cells.
PassAllFilterSupportedPasses all cells unchanged.
RowKeyRegexFilterSupportedBinary regex matching against row keys.
FamilyNameRegexFilterSupportedRegex matching against column family names.
ColumnQualifierRegexFilterSupportedRegex matching against column qualifiers.
ValueRegexFilterSupportedRegex matching against cell values.
ColumnRangeFilterSupportedRange by column qualifier within a family, with inclusive/exclusive bounds.
TimestampRangeFilterSupportedMicrosecond-precision range filtering on cell timestamps.
ValueRangeFilterSupportedRange filtering on cell values with inclusive/exclusive bounds.
CellsPerRowLimitFilterSupportedLimits number of cells returned per row.
CellsPerRowOffsetFilterSupportedSkips first N cells per row.
CellsPerColumnLimitFilterSupportedLimits number of versions per column.
RowSampleFilterSupportedProbabilistic row sampling.
StripValueTransformerSupportedRemoves cell values while keeping metadata (family, qualifier, timestamp).
ApplyLabelTransformerSupportedAdds custom string labels to matched cells.

Table Admin API

AreaStatusCoveredLimits
CreateTableSupportedCreate tables with column families, GC rules, and initial row key splits.
ListTablesSupportedList all tables in an instance.
GetTableSupportedReturns table metadata including deletion protection status.
UpdateTableSupportedUpdate deletion_protection and automated_backup_policy fields.
DeleteTableSupportedRespects deletion protection. Returns error if protection enabled.
ModifyColumnFamiliesSupportedCreate, update, and delete column families with GC rules (MaxNumVersions, MaxAge, union, intersection).
DropRowRangeSupportedClear row range by prefix or delete all rows from table.
GenerateConsistencyTokenSupportedReturns consistency token for replication checks.
CheckConsistencySupportedAlways returns consistent (single-process emulator).
UndeleteTableNot supportedReturns Unimplemented.
Snapshot APIsNot supportedSnapshotTable, GetSnapshot, ListSnapshots, DeleteSnapshot, CreateTableFromSnapshot all return Unimplemented. Deprecated upstream.

Instance Admin API

AreaStatusCoveredLimits
Instance CRUDSupportedCreateInstance (auto-creates clusters, sets type/display name/labels), GetInstance, ListInstances, UpdateInstance, PartialUpdateInstance, DeleteInstance (cascades to tables, clusters, app profiles).No billing or quota enforcement.
Cluster CRUDSupportedCreateCluster, GetCluster, ListClusters, UpdateCluster, PartialUpdateCluster (update serve_nodes), DeleteCluster.Serve nodes and storage type stored but not enforced.
App Profile CRUDSupportedCreateAppProfile (auto-sets SingleClusterRouting and StandardIsolation defaults), GetAppProfile, ListAppProfiles, UpdateAppProfile, DeleteAppProfile.Routing policy stored but not enforced for reads/writes.
IAMSupported*GetIamPolicy returns stored policy or empty default. SetIamPolicy stores policy in memory. TestIamPermissions always returns all requested permissions.Permissive stubs — no actual access control enforcement.
ListHotTabletsNot supportedReturns Unimplemented.

Change streams and materialized views

AreaStatusCoveredLimits
GenerateInitialChangeStreamPartitionsSupportedReturns one stable full-table partition token.Single partition only. No partition-level row key range filtering.
ReadChangeStreamSupportedStreaming change events with continuation tokens, start-time filtering, configurable heartbeat duration (default 5s), and mutation type tracking (set_cell, delete_from_column, delete_from_family, delete_from_row). Microsecond-precision commit timestamps.Single partition only. No multi-partition fan-out or partition merging.
Change log storageSupportedSQL-backed change_log_t table with automatic append on MutateRow, MutateRows, and ReadModifyWriteRow.
CreateMaterializedViewSupportedSQL query parsing, composite key mapping with reordering, configurable key separator, optional source key appending, selective column family inclusion, automatic shadow table creation. LocalCloud-extended feature.CMV SQL parser scoped to standard Bigtable CMV query format. No backfill of existing data.
CMV write-time propagationSupportedAutomatic propagation on MutateRow, MutateRows, CheckAndMutateRow, ReadModifyWriteRow. Delete propagation for DeleteFromRow and DropRowRange.GC policy changes after CMV creation not reflected in shadow table. No ModifyColumnFamilies sync to shadow tables.
GetMaterializedViewSupportedReturns CMV metadata including query, deletion protection, and source table reference.
ListMaterializedViewsSupportedList all CMVs in an instance.
UpdateMaterializedViewSupportedToggle deletion protection. Query is immutable after creation.
DeleteMaterializedViewSupportedRespects deletion protection. Removes shadow table.

Backups, views, and protection

AreaStatusCoveredLimits
Backup CRUDSupported*CreateBackup, GetBackup, UpdateBackup (expire time), DeleteBackup, ListBackups (by parent cluster). State is always READY immediately.Metadata-only — no actual data snapshot is taken.
CopyBackupSupported*Clones backup metadata with source_backup reference.Metadata copy only.
RestoreTableSupported*Creates new table with source table schema (column families and GC rules).Schema restore only — no row data is restored.
Authorized view CRUDSupported*CreateAuthorizedView, GetAuthorizedView, ListAuthorizedViews, UpdateAuthorizedView, DeleteAuthorizedView. Deletion protection supported.No access enforcement — reads/writes return full table data regardless of view restrictions.
Logical view CRUDSupported*CreateLogicalView, GetLogicalView, ListLogicalViews, UpdateLogicalView, DeleteLogicalView. Deletion protection supported.Query strings stored but not executed.
Deletion protectionSupportedEnforced for tables, materialized views, authorized views, logical views. DeleteTable/Delete* returns error when protection enabled.Not supported for instances.

Garbage collection

AreaStatusCoveredLimits
MaxNumVersionsSupportedKeeps only the N most recent cell versions per column.
MaxAgeSupportedRemoves cells older than specified duration.
Union and intersection rulesSupportedComposite GC rules combining multiple policies.
GC execution modelSupportedLazy GC applied at read and write time on a per-row basis.Single-process model. No background GC compaction.

Explicit non-production behavior

AreaStatusTested behavior
IAM policiesSupported*SetIamPolicy stores policy, GetIamPolicy returns it, TestIamPermissions returns all requested permissions. No access control enforcement.
BackupsSupported*Full metadata lifecycle works. No actual data snapshot — RestoreTable recreates schema only.
Authorized viewsSupported*CRUD operations work. No read/write filtering — all data accessible regardless of view definition.
Logical viewsSupported*CRUD operations work. Query strings are stored but never executed.
Consistency checksSupported*CheckConsistency always returns consistent. Single-process emulator has no replication lag.
Aggregate mutationsSupported*AddToCell and MergeToCell support int64 sum aggregation. HyperLogLog and other aggregate types return raw input without transformation.
Change stream partitionsSupported*Single full-table partition only. No partition splitting, merging, or row key range filtering.

Unsupported product areas

AreaStatusWhat to expect
GoogleSQL for BigtableNot supportedPrepareQuery and ExecuteQuery return Unimplemented. Use the Data API filter pipeline for queries.
Replication and multi-clusterNot supportedSingle-process emulator. No cross-cluster replication, automatic failover, or multi-cluster routing.
Encryption (CMEK)Not supportedNo customer-managed encryption key support. Data stored unencrypted in SQLite/PostgreSQL.
AutoscalingNot supportedNode counts and storage type are stored as metadata but not enforced. No autoscaling behavior.
Hot tablets and Key VisualizerNot supportedListHotTablets returns Unimplemented. No Key Visualizer or performance profiling.
Data BoostNot supportedNo Data Boost read isolation. All reads go through the single emulator process.
Snapshots (deprecated)Not supportedSnapshotTable, GetSnapshot, ListSnapshots, DeleteSnapshot, and CreateTableFromSnapshot return Unimplemented. These APIs are deprecated upstream.
Connector parityNot supportedHBase, Beam, Spark, Flink, and Kafka connector compatibility is not tested. Standard gRPC SDK clients work.
Schema bundlesNot supportedNo schema bundle management support.
Production operationsNot supportedQuota enforcement, billing, audit logging, monitoring metrics, and production-grade authentication are outside emulator scope.

Developer workflow coverage

Based on the supported features above, the emulator is suited for local workflows that need to:

  • Set up instances, clusters, tables, and column families with GC rules in tests.
  • Read and write rows with full filter pipelines, conditional mutations, and atomic read-modify-write operations.
  • Test change stream consumers with realistic mutation events and continuation tokens.
  • Develop materialized view workflows with automatic write-time re-keying propagation.
  • Exercise backup and view management APIs for setup and teardown code paths.
  • Persist all state across emulator restarts via SQLite or PostgreSQL.
  • Run SDK-backed integration tests against a local endpoint using BIGTABLE_EMULATOR_HOST.

This is developer-environment support for local tests and CI, not a production implementation parity claim. Replication, encryption, autoscaling, quota enforcement, and production auth are outside the supported scope.

Persistence and configuration

The emulator supports two persistence backends:

BackendStorage formatDefault
SQLite3BLOB binary, AUTOINCREMENT IDsYes
PostgreSQLBYTEA binary, BIGSERIAL IDsNo

All entities are persisted across restarts: rows, tables, instances, clusters, app profiles, materialized views (metadata and shadow table data), change log records, authorized views, backups, and logical views.

SDK integration: Set BIGTABLE_EMULATOR_HOST to the emulator address. Standard Bigtable SDKs (Go, Python, Node.js, Java, etc.) connect automatically with unauthenticated gRPC.

Embedded usage: The emulator can be embedded as a Go library via the bttest package for in-process testing.