loadingContext)
+ throws NoSuchTableException;
+}
diff --git a/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java b/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
index da22607d05b0..94a90952b446 100644
--- a/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
+++ b/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
@@ -121,7 +121,7 @@
*
*
*/
-public class SparkCatalog extends BaseCatalog {
+public class SparkCatalog extends BaseCatalog implements ContextAwareTableCatalog {
private static final Set DEFAULT_NS_KEYS = ImmutableSet.of(TableCatalog.PROP_OWNER);
private static final Splitter COMMA = Splitter.on(",");
private static final Joiner COMMA_JOINER = Joiner.on(",");
@@ -167,8 +167,14 @@ protected TableIdentifier buildIdentifier(Identifier identifier) {
@Override
public Table loadTable(Identifier ident) throws NoSuchTableException {
+ return loadTable(ident, Map.of());
+ }
+
+ @Override
+ public Table loadTable(Identifier ident, Map context)
+ throws NoSuchTableException {
try {
- return load(ident);
+ return load(ident, context);
} catch (org.apache.iceberg.exceptions.NoSuchTableException e) {
throw new NoSuchTableException(ident);
}
@@ -176,7 +182,13 @@ public Table loadTable(Identifier ident) throws NoSuchTableException {
@Override
public Table loadTable(Identifier ident, String version) throws NoSuchTableException {
- Table table = loadTable(ident);
+ return loadTable(ident, version, Map.of());
+ }
+
+ @Override
+ public Table loadTable(Identifier ident, String version, Map loadingContext)
+ throws NoSuchTableException {
+ Table table = load(ident, loadingContext);
if (table instanceof SparkTable) {
SparkTable sparkTable = (SparkTable) table;
@@ -211,7 +223,13 @@ public Table loadTable(Identifier ident, String version) throws NoSuchTableExcep
@Override
public Table loadTable(Identifier ident, long timestamp) throws NoSuchTableException {
- Table table = loadTable(ident);
+ return loadTable(ident, timestamp, Map.of());
+ }
+
+ @Override
+ public Table loadTable(Identifier ident, long timestamp, Map loadingContext)
+ throws NoSuchTableException {
+ Table table = load(ident, loadingContext);
if (table instanceof SparkTable) {
SparkTable sparkTable = (SparkTable) table;
@@ -858,13 +876,14 @@ private static void checkNotPathIdentifier(Identifier identifier, String method)
}
}
- private Table load(Identifier ident) {
+ private Table load(Identifier ident, Map context) {
if (isPathIdentifier(ident)) {
return loadFromPathIdentifier((PathIdentifier) ident);
}
try {
- org.apache.iceberg.Table table = icebergCatalog.loadTable(buildIdentifier(ident));
+ org.apache.iceberg.Table table = load(buildIdentifier(ident), context);
+
return new SparkTable(table, !cacheEnabled);
} catch (org.apache.iceberg.exceptions.NoSuchTableException e) {
@@ -877,7 +896,7 @@ private Table load(Identifier ident) {
TableIdentifier namespaceAsIdent = buildIdentifier(namespaceToIdentifier(ident.namespace()));
org.apache.iceberg.Table table;
try {
- table = icebergCatalog.loadTable(namespaceAsIdent);
+ table = load(namespaceAsIdent, context);
} catch (Exception ignored) {
// the namespace does not identify a table, so it cannot be a table with a snapshot selector
// throw the original exception
@@ -927,6 +946,16 @@ private Table load(Identifier ident) {
}
}
+ private org.apache.iceberg.Table load(TableIdentifier ident, Map context) {
+ if (icebergCatalog instanceof org.apache.iceberg.catalog.ContextAwareTableCatalog
+ && !context.isEmpty()) {
+ return ((org.apache.iceberg.catalog.ContextAwareTableCatalog) icebergCatalog)
+ .loadTable(ident, context);
+ } else {
+ return icebergCatalog.loadTable(ident);
+ }
+ }
+
private Pair> parseLocationString(String location) {
int hashIndex = location.lastIndexOf('#');
if (hashIndex != -1 && !location.endsWith("#")) {
diff --git a/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkSessionCatalog.java b/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkSessionCatalog.java
index f49660a9f27c..67b6252a53d1 100644
--- a/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkSessionCatalog.java
+++ b/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/SparkSessionCatalog.java
@@ -63,7 +63,7 @@
*/
public class SparkSessionCatalog<
T extends TableCatalog & FunctionCatalog & SupportsNamespaces & ViewCatalog>
- extends BaseCatalog implements CatalogExtension {
+ extends BaseCatalog implements CatalogExtension, ContextAwareTableCatalog {
private static final String[] DEFAULT_NAMESPACE = new String[] {"default"};
private String catalogName = null;
@@ -143,28 +143,60 @@ public Identifier[] listTables(String[] namespace) throws NoSuchNamespaceExcepti
@Override
public Table loadTable(Identifier ident) throws NoSuchTableException {
+ return loadTable(ident, Map.of());
+ }
+
+ @Override
+ public Table loadTable(Identifier identifier, Map context)
+ throws NoSuchTableException {
try {
- return icebergCatalog.loadTable(ident);
- } catch (NoSuchTableException e) {
- return getSessionCatalog().loadTable(ident);
+ if (icebergCatalog instanceof ContextAwareTableCatalog && !context.isEmpty()) {
+ return ((ContextAwareTableCatalog) icebergCatalog).loadTable(identifier, context);
+ } else {
+ return icebergCatalog.loadTable(identifier);
+ }
+ } catch (org.apache.iceberg.exceptions.NoSuchTableException | NoSuchTableException e) {
+ return getSessionCatalog().loadTable(identifier);
}
}
+ @Override
+ public Table loadTable(Identifier ident, long timestamp) throws NoSuchTableException {
+ return loadTable(ident, timestamp, Map.of());
+ }
+
@Override
public Table loadTable(Identifier ident, String version) throws NoSuchTableException {
+ return loadTable(ident, version, Map.of());
+ }
+
+ @Override
+ public Table loadTable(Identifier identifier, String version, Map loadingContext)
+ throws NoSuchTableException {
try {
- return icebergCatalog.loadTable(ident, version);
- } catch (org.apache.iceberg.exceptions.NoSuchTableException e) {
- return getSessionCatalog().loadTable(ident, version);
+ if (icebergCatalog instanceof ContextAwareTableCatalog && !loadingContext.isEmpty()) {
+ return ((ContextAwareTableCatalog) icebergCatalog)
+ .loadTable(identifier, version, loadingContext);
+ } else {
+ return icebergCatalog.loadTable(identifier, version);
+ }
+ } catch (org.apache.iceberg.exceptions.NoSuchTableException | NoSuchTableException e) {
+ return getSessionCatalog().loadTable(identifier, version);
}
}
@Override
- public Table loadTable(Identifier ident, long timestamp) throws NoSuchTableException {
+ public Table loadTable(Identifier identifier, long timestamp, Map loadingContext)
+ throws NoSuchTableException {
try {
- return icebergCatalog.loadTable(ident, timestamp);
- } catch (org.apache.iceberg.exceptions.NoSuchTableException e) {
- return getSessionCatalog().loadTable(ident, timestamp);
+ if (icebergCatalog instanceof ContextAwareTableCatalog && !loadingContext.isEmpty()) {
+ return ((ContextAwareTableCatalog) icebergCatalog)
+ .loadTable(identifier, timestamp, loadingContext);
+ } else {
+ return icebergCatalog.loadTable(identifier, timestamp);
+ }
+ } catch (org.apache.iceberg.exceptions.NoSuchTableException | NoSuchTableException e) {
+ return getSessionCatalog().loadTable(identifier, timestamp);
}
}