Skip to content

Commit 8c5a8c9

Browse files
imingtsoumizanfiu
authored andcommitted
Add delete_record API (aws#664)
1 parent 031ba15 commit 8c5a8c9

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

src/sagemaker/feature_store/feature_group.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,25 @@ def put_record(self, record: Sequence[FeatureValue]):
671671
feature_group_name=self.name, record=[value.to_dict() for value in record]
672672
)
673673

674+
def delete_record(
675+
self,
676+
record_identifier_value_as_string: str,
677+
event_time: str,
678+
):
679+
"""Delete a single record from a FeatureGroup.
680+
681+
Args:
682+
record_identifier_value_as_string (String):
683+
a String representing the value of the record identifier.
684+
event_time (String):
685+
a timestamp format String indicating when the deletion event occurred.
686+
"""
687+
return self.sagemaker_session.delete_record(
688+
feature_group_name=self.name,
689+
record_identifier_value_as_string=record_identifier_value_as_string,
690+
event_time=event_time,
691+
)
692+
674693
def ingest(
675694
self,
676695
data_frame: DataFrame,

src/sagemaker/session.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4454,6 +4454,25 @@ def put_record(
44544454
Record=record,
44554455
)
44564456

4457+
def delete_record(
4458+
self,
4459+
feature_group_name: str,
4460+
record_identifier_value_as_string: str,
4461+
event_time: str,
4462+
):
4463+
"""Deletes a single record from the FeatureGroup.
4464+
4465+
Args:
4466+
feature_group_name (str): name of the FeatureGroup.
4467+
record_identifier_value_as_string (str): name of the record identifier.
4468+
event_time (str): a timestamp indicating when the deletion event occurred.
4469+
"""
4470+
return self.sagemaker_featurestore_runtime_client.delete_record(
4471+
FeatureGroupName=feature_group_name,
4472+
RecordIdentifierValueAsString=record_identifier_value_as_string,
4473+
EventTime=event_time,
4474+
)
4475+
44574476
def get_record(
44584477
self,
44594478
record_identifier_value_as_string: str,

tests/integ/test_feature_store.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import json
1616
import time
17+
import datetime
1718
from contextlib import contextmanager
1819

1920
import boto3
@@ -336,6 +337,45 @@ def test_get_record(
336337
assert retrieved_record is None
337338

338339

340+
def test_delete_record(
341+
feature_store_session,
342+
role,
343+
feature_group_name,
344+
pandas_data_frame,
345+
record,
346+
):
347+
feature_group = FeatureGroup(name=feature_group_name, sagemaker_session=feature_store_session)
348+
feature_group.load_feature_definitions(data_frame=pandas_data_frame)
349+
350+
record_identifier_value_as_string = record[0].value_as_string
351+
with cleanup_feature_group(feature_group):
352+
feature_group.create(
353+
s3_uri=False,
354+
record_identifier_name="feature1",
355+
event_time_feature_name="feature3",
356+
role_arn=role,
357+
enable_online_store=True,
358+
)
359+
_wait_for_feature_group_create(feature_group)
360+
# Ingest data
361+
feature_group.put_record(record=record)
362+
# Retrieve data
363+
retrieved_record = feature_group.get_record(
364+
record_identifier_value_as_string=record_identifier_value_as_string,
365+
)
366+
assert retrieved_record is not None
367+
# Delete data
368+
feature_group.delete_record(
369+
record_identifier_value_as_string=record_identifier_value_as_string,
370+
event_time=datetime.datetime.now().replace(microsecond=0).isoformat() + "Z",
371+
)
372+
# Retrieve data
373+
retrieved_record = feature_group.get_record(
374+
record_identifier_value_as_string=record_identifier_value_as_string,
375+
)
376+
assert retrieved_record is None
377+
378+
339379
def test_update_feature_group(
340380
feature_store_session,
341381
role,

tests/unit/sagemaker/feature_store/test_feature_group.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,21 @@ def test_put_record(sagemaker_session_mock):
225225
)
226226

227227

228+
def test_delete_record(sagemaker_session_mock):
229+
feature_group = FeatureGroup(name="MyFeatureGroup", sagemaker_session=sagemaker_session_mock)
230+
record_identifier_value_as_string = "1.0"
231+
event_time = "2022-09-14"
232+
feature_group.delete_record(
233+
record_identifier_value_as_string=record_identifier_value_as_string,
234+
event_time=event_time,
235+
)
236+
sagemaker_session_mock.delete_record.assert_called_with(
237+
feature_group_name="MyFeatureGroup",
238+
record_identifier_value_as_string=record_identifier_value_as_string,
239+
event_time=event_time,
240+
)
241+
242+
228243
def test_load_feature_definition(sagemaker_session_mock):
229244
feature_group = FeatureGroup(name="SomeGroup", sagemaker_session=sagemaker_session_mock)
230245
df = pd.DataFrame(

0 commit comments

Comments
 (0)