apache/seatunnel · error · TableNotExistException

Table ${tablePath} does not exist in catalog ${catalogName}

Error message

Table ${tablePath} does not exist in catalog ${catalogName}

What it means

Thrown by HudiCatalog.getTable() as a standard TableNotExistException when tableExists() returns false for the requested TablePath. This is the catalog's contract for reading a table schema that is not present under the configured parent path with valid Hudi metadata.

Source

Thrown at seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/catalog/HudiCatalog.java:182

    public boolean tableExists(TablePath tablePath) throws CatalogException {
        String basePath = inferTablePath(tableParentDfsPathStr, tablePath);
        try {
            return fs.exists(new Path(basePath, HoodieTableMetaClient.METAFOLDER_NAME))
                    && fs.exists(
                            new Path(
                                    new Path(basePath, HoodieTableMetaClient.METAFOLDER_NAME),
                                    HoodieTableConfig.HOODIE_PROPERTIES_FILE));
        } catch (IOException e) {
            throw new CatalogException(
                    "Error while checking whether table exists under path:" + basePath, e);
        }
    }

    @Override
    public CatalogTable getTable(TablePath tablePath)
            throws CatalogException, TableNotExistException {
        if (!tableExists(tablePath)) {
            throw new TableNotExistException(name(), tablePath);
        }
        HoodieTableMetaClient hoodieTableMetaClient =
                HoodieTableMetaClient.builder()
                        .setBasePath(inferTablePath(tableParentDfsPathStr, tablePath))
                        .setConf(HadoopFSUtils.getStorageConfWithCopy(hadoopConf))
                        .build();
        HoodieTableType tableType = hoodieTableMetaClient.getTableType();
        HoodieTableConfig tableConfig = hoodieTableMetaClient.getTableConfig();
        TableSchema tableSchema = convertSchema(TableSchema.builder(), tableConfig);
        List<String> partitionFields = null;
        if (tableConfig.getPartitionFields().isPresent()) {
            partitionFields = Arrays.asList(tableConfig.getPartitionFields().get());
        }

        Map<String, String> options = new HashMap<>();
        if (tableConfig.getRecordKeyFields().isPresent()) {
            options.put(
                    RECORD_KEY_FIELDS.key(),

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Verify the exact database.table path exists and contains .hoodie/hoodie.properties on the filesystem.
  2. Create the table first with catalog.createTable() or point the config at the existing table.
  3. Align the catalog's table_parent_dfs_path with the real Hudi tables root.
  4. Check case/namespace differences (S3 keys are case-sensitive).

Example fix

// before
CatalogTable t = catalog.getTable(TablePath.of("mydb","orders")); // fails if missing
// after
if (catalog.tableExists(TablePath.of("mydb","orders"))) {
    CatalogTable t = catalog.getTable(TablePath.of("mydb","orders"));
} else {
    catalog.createTable(TablePath.of("mydb","orders"), schema, false);
}
Defensive patterns

Strategy: validation

Validate before calling

// Java
if (!catalog.tableExists(TablePath.of(db, tbl))) {
    throw new IllegalStateException("Table " + db + "." + tbl + " not found; check path/config");
}

Try / catch

// Java
try {
    CatalogTable t = catalog.getTable(tablePath);
} catch (TableNotExistException e) {
    // create table or fail fast with a clear config-error message
}

Prevention

When it happens

Trigger: Calling getTable(tablePath) (e.g., during job startup schema resolution) when <basePath>/.hoodie/hoodie.properties does not exist: table never created, wrong database/table name, or table written to a different root than table_parent_dfs_path.

Common situations: Typo in table name or database in the SeaTunnel config; Hudi table created by another tool at a different location; catalog's table_parent_dfs_path not pointing to the Hudi table root; case-sensitivity mismatch on object stores.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/739276b2a1a5ff84. Report an issue: GitHub.