@@ -439,71 +439,73 @@ def _commit_table(self, table_request: CommitTableRequest) -> CommitTableRespons
439439 )
440440 database_name , table_name = self .identifier_to_database_and_table (identifier_tuple )
441441
442+ current_glue_table : Optional [TableTypeDef ]
443+ glue_table_version_id : Optional [str ]
444+ current_table : Optional [Table ]
442445 try :
443446 current_glue_table = self ._get_glue_table (database_name = database_name , table_name = table_name )
444- # Update the table
445447 glue_table_version_id = current_glue_table .get ("VersionId" )
446- if not glue_table_version_id :
447- raise CommitFailedException (
448- f"Cannot commit { database_name } .{ table_name } because Glue table version id is missing"
449- )
450448 current_table = self ._convert_glue_to_iceberg (glue_table = current_glue_table )
451- base_metadata = current_table .metadata
449+ except NoSuchTableError :
450+ current_glue_table = None
451+ glue_table_version_id = None
452+ current_table = None
453+
454+ for requirement in table_request .requirements :
455+ requirement .validate (current_table .metadata if current_table else None )
452456
453- # Validate the update requirements
454- for requirement in table_request .requirements :
455- requirement .validate (base_metadata )
457+ updated_metadata = update_table_metadata (
458+ base_metadata = current_table .metadata if current_table else self ._empty_table_metadata (),
459+ updates = table_request .updates ,
460+ enforce_validation = current_table is None ,
461+ )
456462
457- updated_metadata = update_table_metadata (base_metadata = base_metadata , updates = table_request .updates )
458- if updated_metadata == base_metadata :
459- # no changes, do nothing
460- return CommitTableResponse (metadata = base_metadata , metadata_location = current_table .metadata_location )
463+ if current_table and updated_metadata == current_table .metadata :
464+ # no changes, do nothing
465+ return CommitTableResponse (metadata = current_table .metadata , metadata_location = current_table .metadata_location )
461466
462- # write new metadata
463- new_metadata_version = self ._parse_metadata_version (current_table .metadata_location ) + 1
464- new_metadata_location = self ._get_metadata_location (current_table .metadata .location , new_metadata_version )
465- self ._write_metadata (updated_metadata , current_table .io , new_metadata_location )
467+ new_metadata_version = self ._parse_metadata_version (current_table .metadata_location ) + 1 if current_table else 0
468+ new_metadata_location = self ._get_metadata_location (updated_metadata .location , new_metadata_version )
469+ self ._write_metadata (
470+ metadata = updated_metadata ,
471+ io = self ._load_file_io (updated_metadata .properties , new_metadata_location ),
472+ metadata_path = new_metadata_location ,
473+ )
474+
475+ if current_table :
476+ # table exists, update the table
477+ if not glue_table_version_id :
478+ raise CommitFailedException (
479+ f"Cannot commit { database_name } .{ table_name } because Glue table version id is missing"
480+ )
466481
482+ # Pass `version_id` to implement optimistic locking: it ensures updates are rejected if concurrent
483+ # modifications occur. See more details at https://iceberg.apache.org/docs/latest/aws/#optimistic-locking
467484 update_table_input = _construct_table_input (
468485 table_name = table_name ,
469486 metadata_location = new_metadata_location ,
470- properties = current_table .properties ,
487+ properties = updated_metadata .properties ,
471488 metadata = updated_metadata ,
472489 glue_table = current_glue_table ,
473490 prev_metadata_location = current_table .metadata_location ,
474491 )
475-
476- # Pass `version_id` to implement optimistic locking: it ensures updates are rejected if concurrent
477- # modifications occur. See more details at https://iceberg.apache.org/docs/latest/aws/#optimistic-locking
478492 self ._update_glue_table (
479493 database_name = database_name ,
480494 table_name = table_name ,
481495 table_input = update_table_input ,
482496 version_id = glue_table_version_id ,
483497 )
484-
485- return CommitTableResponse (metadata = updated_metadata , metadata_location = new_metadata_location )
486- except NoSuchTableError :
487- # Create the table
488- updated_metadata = update_table_metadata (
489- base_metadata = self ._empty_table_metadata (), updates = table_request .updates , enforce_validation = True
490- )
491- new_metadata_version = 0
492- new_metadata_location = self ._get_metadata_location (updated_metadata .location , new_metadata_version )
493- self ._write_metadata (
494- updated_metadata , self ._load_file_io (updated_metadata .properties , new_metadata_location ), new_metadata_location
495- )
496-
498+ else :
499+ # table does not exist, create the table
497500 create_table_input = _construct_table_input (
498501 table_name = table_name ,
499502 metadata_location = new_metadata_location ,
500503 properties = updated_metadata .properties ,
501504 metadata = updated_metadata ,
502505 )
503-
504506 self ._create_glue_table (database_name = database_name , table_name = table_name , table_input = create_table_input )
505507
506- return CommitTableResponse (metadata = updated_metadata , metadata_location = new_metadata_location )
508+ return CommitTableResponse (metadata = updated_metadata , metadata_location = new_metadata_location )
507509
508510 def load_table (self , identifier : Union [str , Identifier ]) -> Table :
509511 """Load the table's metadata and returns the table instance.
0 commit comments