Changelog
1.1.0 - 2026-10-24
- Per-catalog Hadoop options:
spark.sql.catalog.<name>.hadoop.<key>applies to every table the catalog loads, creates or replaces. Nothing is written to Glue or the Delta log. Onlyfs.*anddfs.*keys reach Delta. - S3A inherits the catalog's role by default. A catalog with
client.assume-role.arn(and noclient.credentials-provider) now makes S3A assume the same role for its tables' files. This changes behaviour for existing catalogs with a role: sethadoop.fs.s3a.aws.credentials.providerto opt out. Session per-bucket keys (fs.s3a.bucket.<name>.*) still win. S3A's own STS call keeps the credentials chain the session used before: gluecat derivesfs.s3a.assumed.role.credentials.providerfrom the session's effectivefs.s3a.aws.credentials.provider(name the web-identity provider for IRSA). gluecat does not derivefs.s3a.endpoint.region. On Spark 3.5 (Hadoop 3.3), which cannot send an external ID, a catalog withclient.assume-role.external-idderives nothing for S3A and logs a warning. http-client.*options (client type, timeouts, pool size, proxy) for the Glue and STS clients, with Iceberg's names.software.amazon.awssdk:apache-clientandurl-connection-clientare optionalprovideddependencies; a missing one fails atinitializewith a message naming the artifact and the missing class. The proxy keys apply to both client types.- Every integration suite's main catalog runs under IAM enforcement, with a role that has exactly ten Glue actions. That policy is published in the documentation.
- New documentation page, "Across AWS accounts": identity model, IAM pieces, regions, sessions, S3, a worked example and troubleshooting.
- Known limitations of the per-catalog Hadoop options:
writeStream.toTableon a Delta table by name (and, on Delta 3.3,readStream.table) does not receive them: Spark starts the sink with the provider and location only and Delta builds its log without storage properties, so the session configuration is used. With a role-bearing catalog, streaming then reaches the bucket with the session identity while batch work uses the role. Workarounds: per-bucket session keys (fs.s3a.bucket.<name>.*) for the buckets that streaming writes, orforeachBatchwith batch writes by name.- Priming the
FileSystemand skipping the write options underspark.databricks.delta.legacy.storeOptionsAsPropertiesact in the driver JVM only. Executor-side Delta work for by-path operations (snapshot reconstruction when the latest log version has no.crcfile, common for tables written by Trino or delta-rs; data files written under the legacy flag) uses the session configuration in any multi-JVM deployment.
Upgrading from 1.0.0
- Every catalog with
client.assume-role.arn(and noclient.credentials-provider) now reaches S3 through that role, so the one-bucket-one-way rule applies to its buckets: anything else in the same JVM that reaches them with another identity (streaming checkpoints, direct path reads, other catalogs, streaming writes) shares whicheverFileSystemopened the bucket first. DESCRIBE EXTENDED,SHOW TBLPROPERTIESandSHOW CREATE TABLEshow the catalog'soption.fs.s3a.*keys for non-Delta tables and for Delta before 4.3. Running aSHOW CREATE TABLEoutput again persists those keys into the Glue entry (non-Delta) or the Delta log (Delta), where they then override the catalog's values; remove them from the statement first.- To keep 1.0.0's S3 behaviour for a catalog, set
hadoop.fs.s3a.aws.credentials.providerto the session's provider list (the session'sfs.s3a.aws.credentials.provider, or Hadoop's default list when the session sets none). http-client.*andhadoop.*keys, which 1.0.0 ignored silently, now take effect, andhttp-client.type = urlconnectionneedssoftware.amazon.awssdk:url-connection-clienton the classpath. Keys for both client types (http-client.apache.*andhttp-client.urlconnection.*) withouthttp-client.typenow fail atinitialize.
1.0.0 - 2026-10-23
First release.
- Artifacts
io.github.sdaberdaku:gluecat-spark-<minor>_<scala>for Spark 3.5 (Scala 2.12 and 2.13, Java 8 bytecode, Spark 3.5.3 and later) and Spark 4.0, 4.1 and 4.2 (Scala 2.13, Java 17 bytecode). io.github.sdaberdaku.gluecat.GlueCatalog: one Glue Data Catalog per Spark catalog, with its own catalog ID (glue.id) and credentials (custom provider class, STS assume role, or the SDK default chain including IRSA). Works as a named catalog and asspark_catalog.- Delta tables: load, read, write and time travel by name through Delta's
DeltaCatalog;CREATE TABLE, CTAS,REPLACE,saveAsTable,writeToandwriteStream.toTablerun on the table path, then write the Glue entry.ALTER TABLEcolumn changes and SQLREFRESH TABLEre-sync the Glue columns. - Other data source tables (Parquet, ORC, CSV, JSON, ...): load and read, create and alter the Glue entry.
- Glue databases as Spark namespaces: create, alter, drop (with
CASCADE), list,USE. RENAMEandDROPchange the Glue entry only; data is never deleted andPURGEis refused.- Every Glue
UpdateTablepasses theVersionIdit read; a concurrent change fails with a retryable error. - The catalog refuses to run while Delta's
UpdateCataloghook is enabled, because the hook writes throughspark_catalog. - Non-Delta tables are refused by name while
spark.sql.statistics.size.autoUpdate.enabledis on, because Spark's V1 insert path then updates statistics throughspark_catalog. - Non-Delta tables: partition columns are moved to the end of the schema on load, as Spark's Hive path does; dropping
or renaming a partition column and
ADD COLUMN ... DEFAULTare refused. - Glue column comments are written single-line and cut to 255 bytes, table descriptions to 2048 bytes (Glue's limits); the schema JSON and the Delta log keep the full text.
- AWS SDK for Java v2 (
glue,sts) as aprovideddependency, built and tested against 2.24.6. Assume-role sessions refresh on the calling thread: Spark never closes catalog plugins, so no background refresh is started.