{"record":{"id":"4960c707087579b5","repo":"apache/seatunnel","slug":"table-config-not-found-4960c7","errorCode":"TABLE_CONFIG_NOT_FOUND","errorMessage":"The corresponding table ${tableName} is not found in the table list of hudi sink config.","messagePattern":"The corresponding table (.+?) is not found in the table list of hudi sink config\\.","errorType":"error_code","errorClass":"HudiConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/util/HudiUtil.java","lineNumber":149,"sourceCode":"            UserGroupInformation.setConfiguration(conf);\n            UserGroupInformation.loginUserFromKeytab(principal, principalFile);\n        } catch (IOException e) {\n            throw new HudiConnectorException(\n                    CommonErrorCodeDeprecated.KERBEROS_AUTHORIZED_FAILED,\n                    \"Kerberos Authorized Fail!\",\n                    e);\n        }\n    }\n\n    public static HoodieJavaWriteClient<HoodieAvroPayload> createHoodieJavaWriteClient(\n            HudiSinkConfig hudiSinkConfig, SeaTunnelRowType seaTunnelRowType, String tableName) {\n        List<HudiTableConfig> tableList = hudiSinkConfig.getTableList();\n        Optional<HudiTableConfig> hudiTableConfig =\n                tableList.stream()\n                        .filter(table -> table.getTableName().equals(tableName))\n                        .findFirst();\n        if (!hudiTableConfig.isPresent()) {\n            throw new HudiConnectorException(\n                    TABLE_CONFIG_NOT_FOUND,\n                    \"The corresponding table \"\n                            + tableName\n                            + \" is not found in the table list of hudi sink config.\");\n        }\n        Configuration hadoopConf = getConfiguration(hudiSinkConfig.getConfFilesPath());\n\n        HudiTableConfig hudiTable = hudiTableConfig.get();\n        HoodieWriteConfig.Builder writeConfigBuilder = HoodieWriteConfig.newBuilder();\n        // build index config\n        if (Objects.nonNull(hudiTable.getIndexClassName())) {\n            writeConfigBuilder.withIndexConfig(\n                    HoodieIndexConfig.newBuilder()\n                            .withIndexClass(hudiTable.getIndexClassName())\n                            .build());\n        } else {\n            writeConfigBuilder.withIndexConfig(\n                    HoodieIndexConfig.newBuilder().withIndexType(hudiTable.getIndexType()).build());","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/util/HudiUtil.java#L131-L167","documentation":"createHoodieJavaWriteClient looks up the table being written in the hudi sink's configured table list. When no HudiTableConfig whose tableName matches is present, it throws TABLE_CONFIG_NOT_FOUND because the sink cannot know the target hoodie table's settings (record keys, precombine field, etc.).","triggerScenarios":"Writing to a Hudi table via HudiUtil.createHoodieJavaWriteClient where tableName from the incoming data/catalog does not equal any table.tableName entry in the sink config's table_list.","commonSituations":"Typo or case mismatch between the configured table name and the actual table; upstream data contains a table not added to the sink's table list; catalog/database-qualified names (db.table) configured differently from the plain tableName used at lookup.","solutions":["Add the missing table to the hudi sink table_list config, matching tableName exactly.","Check for case/qualified-name mismatches: the config value must equal getTableName() on the incoming table exactly (no db prefix unless configured that way).","Log or dump the resolved tableName at runtime and diff it against the configured list.","If tables are dynamic, validate the set of upstream tables against the config before job submission."],"exampleFix":"// before\nsink {\n  Hudi {\n    table_list = [\n      { table_name = \"orders\" ... }\n    ]\n  }\n}\n// after\nsink {\n  Hudi {\n    table_list = [\n      { table_name = \"orders\" ... },\n      { table_name = \"customers\" ... }   // table present in upstream data\n    ]\n  }\n}","handlingStrategy":"validation","validationCode":"Set<String> configured = sinkConfig.getTableList().stream()\n    .map(HudiTableConfig::getTableName).collect(Collectors.toSet());\nif (!configured.contains(tableName)) {\n    throw new IllegalArgumentException(\"table not in hudi sink table_list: \" + tableName);\n}","typeGuard":null,"tryCatchPattern":"try {\n    HoodieJavaWriteClient<?> client = HudiUtil.createHoodieJavaWriteClient(config, tableName);\n} catch (HudiConnectorException e) {\n    LOG.error(\"table {} missing from hudi sink table_list\", tableName, e);\n    throw e;\n}","preventionTips":["Generate table_list from the same catalog metadata used upstream to guarantee names match.","Watch for db-qualified vs plain table names.","Add a startup assertion validating all upstream tables appear in the config."],"tags":["configuration","hudi","table-not-found"],"backgroundTag":"record-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}