{"record":{"id":"83b7a5cfdc30bcef","repo":"apache/seatunnel","slug":"multiple-input-tables-are-not-supported-in-the-cur","errorCode":null,"errorMessage":"Multiple input tables are not supported in the current version","messagePattern":"Multiple input tables are not supported in the current version","errorType":"validation","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-core/seatunnel-spark-starter/seatunnel-spark-starter-common/src/main/java/org/apache/seatunnel/core/starter/spark/execution/SparkAbstractPluginExecuteProcessor.java","lineNumber":88,"sourceCode":"    protected void registerInputTempView(Config pluginConfig, Dataset<Row> dataStream) {\n        ReadonlyConfig readonlyConfig = ReadonlyConfig.fromConfig(pluginConfig);\n        if (readonlyConfig.getOptional(PLUGIN_OUTPUT).isPresent()) {\n            String tableName = readonlyConfig.get(PLUGIN_OUTPUT);\n            registerTempView(tableName, dataStream);\n        }\n    }\n\n    protected Optional<DatasetTableInfo> fromSourceTable(\n            Config pluginConfig,\n            SparkRuntimeEnvironment sparkRuntimeEnvironment,\n            List<DatasetTableInfo> upstreamDataStreams) {\n        List<String> pluginInputIdentifiers =\n                ReadonlyConfig.fromConfig(pluginConfig).get(PLUGIN_INPUT);\n        if (pluginInputIdentifiers == null || pluginInputIdentifiers.isEmpty()) {\n            return Optional.empty();\n        }\n        if (pluginInputIdentifiers.size() > 1) {\n            throw new UnsupportedOperationException(\n                    \"Multiple input tables are not supported in the current version\");\n        }\n        String pluginInputIdentifier = pluginInputIdentifiers.get(0);\n        DatasetTableInfo datasetTableInfo =\n                upstreamDataStreams.stream()\n                        .filter(info -> pluginInputIdentifier.equals(info.getTableName()))\n                        .findFirst()\n                        .orElseThrow(\n                                () ->\n                                        new SeaTunnelException(\n                                                String.format(\n                                                        \"table %s not found\",\n                                                        pluginInputIdentifier)));\n        return Optional.of(\n                new DatasetTableInfo(\n                        sparkRuntimeEnvironment\n                                .getSparkSession()\n                                .read()","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-starter-common/src/main/java/org/apache/seatunnel/core/starter/spark/execution/SparkAbstractPluginExecuteProcessor.java#L70-L106","documentation":"SparkAbstractPluginExecuteProcessor.fromSourceTable resolves a plugin's declared upstream input tables (plugin_input). If the plugin declares more than one input table identifier, the Spark Dataset-based execution path — which supports only single-input operators — throws UnsupportedOperationException. Multi-input joins on Spark are not implemented in this version.","triggerScenarios":"A transform/plugin config sets plugin_input to a list with more than one table name, e.g. plugin_input = [\"table_a\", \"table_b\"], and the job runs on the Spark engine.","commonSituations":"Sharing one config file across engines (Zeta/Flink support multi-input, Spark does not); users trying to implement join-type transforms on Spark; copy-paste of Flink configs.","solutions":["Reduce plugin_input to a single table for Spark jobs","Restructure the DAG so multi-input transforms run on Zeta engine instead of Spark","Pre-merge upstream tables with a supported single-input transform chain","Split the job into multiple stages writing intermediate results"],"exampleFix":"// before\nplugin_input = [\"table_a\", \"table_b\"]\n// after\nplugin_input = \"table_a\"","handlingStrategy":"validation","validationCode":"if (pluginInputIdentifiers != null && pluginInputIdentifiers.size() > 1) {\n    throw new IllegalArgumentException(\"Spark engine supports only one plugin_input table\");\n}","typeGuard":"boolean isSingleInput(List<String> inputs) {\n    return inputs == null || inputs.size() <= 1;\n}","tryCatchPattern":"try {\n    runSparkJob();\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage().contains(\"Multiple input tables\")) {\n        log.error(\"Run this DAG on Zeta engine or reduce plugin_input to one table\");\n    }\n}","preventionTips":["Keep plugin_input to a single table in Spark engine configs","Don't share multi-input configs between Zeta and Spark without adaptation","Implement join-style logic via two sequential jobs with intermediate sinks on Spark"],"tags":["spark","multi-table","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}