This is an automated email from the ASF dual-hosted git repository.

vincbeck pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 1eb84604d6c Add `GlueCatalogDeleteTableOperator` (#66380)
1eb84604d6c is described below

commit 1eb84604d6c34c303fed4778ab664a5d0be5c3a8
Author: John Jackson <[email protected]>
AuthorDate: Tue May 5 06:58:56 2026 -0700

    Add `GlueCatalogDeleteTableOperator` (#66380)
---
 providers/amazon/docs/operators/glue_catalog.rst   | 14 ++++++
 .../providers/amazon/aws/operators/glue_catalog.py | 51 ++++++++++++++++++++++
 .../system/amazon/aws/example_glue_catalog.py      | 23 +++++-----
 .../unit/amazon/aws/operators/test_glue_catalog.py | 22 ++++++++++
 4 files changed, 99 insertions(+), 11 deletions(-)

diff --git a/providers/amazon/docs/operators/glue_catalog.rst 
b/providers/amazon/docs/operators/glue_catalog.rst
index a21394fe7fe..e71a28e8830 100644
--- a/providers/amazon/docs/operators/glue_catalog.rst
+++ b/providers/amazon/docs/operators/glue_catalog.rst
@@ -68,3 +68,17 @@ To delete a database from the AWS Glue Data Catalog, use
     :dedent: 4
     :start-after: [START howto_operator_glue_catalog_delete_database]
     :end-before: [END howto_operator_glue_catalog_delete_database]
+
+.. _howto/operator:GlueCatalogDeleteTableOperator:
+
+Delete a Table
+--------------
+
+To delete a table from an AWS Glue Data Catalog database, use
+:class:`~airflow.providers.amazon.aws.operators.glue_catalog.GlueCatalogDeleteTableOperator`.
+
+.. exampleinclude:: 
/../../amazon/tests/system/amazon/aws/example_glue_catalog.py
+    :language: python
+    :dedent: 4
+    :start-after: [START howto_operator_glue_catalog_delete_table]
+    :end-before: [END howto_operator_glue_catalog_delete_table]
diff --git 
a/providers/amazon/src/airflow/providers/amazon/aws/operators/glue_catalog.py 
b/providers/amazon/src/airflow/providers/amazon/aws/operators/glue_catalog.py
index c132802fb7f..1e44ba31837 100644
--- 
a/providers/amazon/src/airflow/providers/amazon/aws/operators/glue_catalog.py
+++ 
b/providers/amazon/src/airflow/providers/amazon/aws/operators/glue_catalog.py
@@ -219,3 +219,54 @@ class 
GlueCatalogCreateTableOperator(AwsBaseOperator[AwsBaseHook]):
                 raise
         self.log.info("Table %s created.", self.table_name)
         return self.table_name
+
+
+class GlueCatalogDeleteTableOperator(AwsBaseOperator[AwsBaseHook]):
+    """
+    Delete a table from an AWS Glue Data Catalog database.
+
+    .. seealso::
+        For more information on how to use this operator, take a look at the 
guide:
+        :ref:`howto/operator:GlueCatalogDeleteTableOperator`
+
+    :param database_name: The name of the database. (templated)
+    :param table_name: The name of the table to delete. (templated)
+    :param catalog_id: The ID of the Data Catalog. Defaults to the account ID. 
(templated)
+    """
+
+    aws_hook_class = AwsBaseHook
+    template_fields: tuple[str, ...] = (
+        *AwsBaseOperator.template_fields,
+        "database_name",
+        "table_name",
+        "catalog_id",
+    )
+
+    def __init__(
+        self,
+        *,
+        database_name: str,
+        table_name: str,
+        catalog_id: str | None = None,
+        **kwargs,
+    ) -> None:
+        super().__init__(**kwargs)
+        self.database_name = database_name
+        self.table_name = table_name
+        self.catalog_id = catalog_id
+
+    @property
+    def _hook_parameters(self) -> dict[str, Any]:
+        return {**super()._hook_parameters, "client_type": "glue"}
+
+    def execute(self, context: Context) -> None:
+        self.log.info("Deleting Glue table %s from database %s", 
self.table_name, self.database_name)
+        kwargs: dict[str, Any] = prune_dict(
+            {
+                "DatabaseName": self.database_name,
+                "Name": self.table_name,
+                "CatalogId": self.catalog_id,
+            }
+        )
+        self.hook.conn.delete_table(**kwargs)
+        self.log.info("Deleted table %s", self.table_name)
diff --git a/providers/amazon/tests/system/amazon/aws/example_glue_catalog.py 
b/providers/amazon/tests/system/amazon/aws/example_glue_catalog.py
index f3c5b5a1acd..157d9013738 100644
--- a/providers/amazon/tests/system/amazon/aws/example_glue_catalog.py
+++ b/providers/amazon/tests/system/amazon/aws/example_glue_catalog.py
@@ -22,6 +22,7 @@ from airflow.providers.amazon.aws.operators.glue_catalog 
import (
     GlueCatalogCreateDatabaseOperator,
     GlueCatalogCreateTableOperator,
     GlueCatalogDeleteDatabaseOperator,
+    GlueCatalogDeleteTableOperator,
 )
 from airflow.providers.common.compat.sdk import DAG, chain
 
@@ -29,9 +30,8 @@ from system.amazon.aws.utils import ENV_ID_KEY, 
SystemTestContextBuilder
 from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_PLUS
 
 if AIRFLOW_V_3_0_PLUS:
-    from airflow.sdk import TriggerRule, task
+    from airflow.sdk import TriggerRule
 else:
-    from airflow.decorators import task  # type: ignore[attr-defined,no-redef]
     from airflow.utils.trigger_rule import TriggerRule  # type: 
ignore[no-redef,attr-defined]
 
 DAG_ID = "example_glue_catalog"
@@ -39,14 +39,6 @@ DAG_ID = "example_glue_catalog"
 sys_test_context_task = SystemTestContextBuilder().build()
 
 
-@task(trigger_rule=TriggerRule.ALL_DONE)
-def delete_table(database_name: str, table_name: str):
-    """Delete the Glue table."""
-    import boto3
-
-    boto3.client("glue").delete_table(DatabaseName=database_name, 
Name=table_name)
-
-
 with DAG(
     dag_id=DAG_ID,
     schedule=None,
@@ -94,11 +86,20 @@ with DAG(
     )
     # [END howto_operator_glue_catalog_create_table]
 
+    # [START howto_operator_glue_catalog_delete_table]
+    delete_table = GlueCatalogDeleteTableOperator(
+        task_id="delete_table",
+        database_name=db_name,
+        table_name=table_name,
+        trigger_rule=TriggerRule.ALL_DONE,
+    )
+    # [END howto_operator_glue_catalog_delete_table]
+
     chain(
         test_context,
         create_database,
         create_table,
-        delete_table(database_name=db_name, table_name=table_name),
+        delete_table,
         delete_database,
     )
 
diff --git 
a/providers/amazon/tests/unit/amazon/aws/operators/test_glue_catalog.py 
b/providers/amazon/tests/unit/amazon/aws/operators/test_glue_catalog.py
index 00a6b6eff05..68ab1bb19f1 100644
--- a/providers/amazon/tests/unit/amazon/aws/operators/test_glue_catalog.py
+++ b/providers/amazon/tests/unit/amazon/aws/operators/test_glue_catalog.py
@@ -27,6 +27,7 @@ from airflow.providers.amazon.aws.operators.glue_catalog 
import (
     GlueCatalogCreateDatabaseOperator,
     GlueCatalogCreateTableOperator,
     GlueCatalogDeleteDatabaseOperator,
+    GlueCatalogDeleteTableOperator,
 )
 
 from unit.amazon.aws.utils.test_template_fields import validate_template_fields
@@ -204,3 +205,24 @@ class TestGlueCatalogCreateTableOperator:
 
     def test_template_fields(self):
         validate_template_fields(self.operator)
+
+
+class TestGlueCatalogDeleteTableOperator:
+    def setup_method(self):
+        self.operator = GlueCatalogDeleteTableOperator(
+            task_id="delete_table",
+            database_name=DB_NAME,
+            table_name=TABLE_NAME,
+        )
+
+    @mock.patch.object(AwsBaseHook, "conn", new_callable=mock.PropertyMock)
+    def test_execute(self, mock_conn):
+        mock_client = mock.MagicMock()
+        mock_conn.return_value = mock_client
+
+        self.operator.execute({})
+
+        mock_client.delete_table.assert_called_once_with(DatabaseName=DB_NAME, 
Name=TABLE_NAME)
+
+    def test_template_fields(self):
+        validate_template_fields(self.operator)

Reply via email to