Overcast is alpha — behaviour and APIs may change between releases. Pin your version and read the changelog before upgrading.

overcast

Glue — AWS Glue Data Catalog

Quick start, the Data Catalog operations that work — databases, tables, versions and partitions — how they differ from AWS, and what outside the catalog is not emulated.

Only the Data Catalog is emulated: databases, tables, table versions and partitions, kept as metadata exactly as you define them. ETL jobs, crawlers and workflows are not.

Status: ⚠️ Partial

Quick start

export AWS_ENDPOINT_URL=http://localhost:4566

aws glue create-database --database-input Name=analytics
aws glue create-table --database-name analytics --table-input '{
  "Name": "events", "TableType": "EXTERNAL_TABLE",
  "PartitionKeys": [{"Name": "dt", "Type": "string"}],
  "StorageDescriptor": {"Location": "s3://data/events/",
    "Columns": [{"Name": "id", "Type": "bigint"}]}}'
aws glue create-partition --database-name analytics --table-name events \
  --partition-input 'Values=2024-01-01'
aws glue get-partitions --database-name analytics --table-name events \
  --expression "dt >= '2024-01-01'"

Any credentials work; with none configured, run eval "$(overcast env)" first — see Using AWS SDKs and CLI.

What works

AreaBehaviour
DatabasesCreate, get, list, update and delete. Deleting a database deletes its tables, partitions and table versions
TablesCreate, get, list, update, delete and batch delete, keeping the whole TableInput
VersionsUpdateTable archives the replaced definition unless SkipArchive is set
ConcurrencyAn UpdateTable whose VersionId is not current is ConcurrentModificationException
PartitionsCreate, get, update and delete, singly and in batches
Partition queriesGetPartitions filters by Expression, pages, and honours Segment and ExcludeColumnSchema
NamesDatabase and table names are folded to lowercase, as on AWS
ErrorsAlreadyExistsException on a duplicate, EntityNotFoundException for a missing parent, both HTTP 400
PagingGetDatabases, GetTables, GetTableVersions and GetPartitions take MaxResults and NextToken
TagsTags on CreateDatabase, and TagResource, UntagResource and GetTags on database and table ARNs
CloudFormationAWS::Glue::Database, AWS::Glue::Table and AWS::Glue::Partition

A stored table keeps everything TableInput carries — StorageDescriptor with its columns, serde and Location, PartitionKeys, Parameters such as table_type and metadata_location, view text — and gains CreateTime, UpdateTime and VersionId.

Partition expressions

A GetPartitions Expression may use =, <>, !=, <, <=, >, >=, AND, OR, NOT, IN, BETWEEN, LIKE, IS NULL and parentheses over the table’s partition keys. Keys typed int, bigint, long, smallint, tinyint or decimal compare as numbers; string, char, varchar, date and timestamp keys compare as text. Anything else — a function call, arithmetic, an unknown key — is InvalidInputException rather than a filter that matches everything.

Differences from AWS

AreaOn AWSOvercast
Jobs, crawlers, triggers, workflows, connections, schema registry, Data QualityFull APINot implemented; the Data Catalog only
OpenTableFormatInput.IcebergInputWrites the table’s initial Iceberg metadataSets table_type=ICEBERG and writes no metadata
UpdateOpenTableFormatInputApplies Iceberg updates501
Rename through an updateNot offeredA differing input Name is InvalidInputException
Cascading deletesAsynchronousImmediate
Partition indexes, column statistics, transactionsSupportedIgnored
CatalogIdSelects the catalogEchoed, never used to separate catalogs
Lake FormationEnforces grantsReports the default IAM_ALLOWED_PRINCIPALS permission and enforces nothing

An Iceberg table created through IcebergInput has no metadata_location, and the response carries an x-overcast-emulation-limitation header saying so.

Gotchas

Note

Athena does not query this catalogue yet. It records queries and returns empty result sets, so a table defined here changes nothing about what a query answers.

Iceberg clients that write their own metadata, such as PyIceberg’s GlueCatalog, commit through UpdateTable with VersionId. A lost race is the same ConcurrentModificationException they retry on AWS.

Operations

All 26 listed operations are implemented. Per-operation status, notes and AWS API links: Glue operations.