diff --git a/sdk/python/feast/infra/offline_stores/remote.py b/sdk/python/feast/infra/offline_stores/remote.py index abe75ca57e5..e0a1df573d4 100644 --- a/sdk/python/feast/infra/offline_stores/remote.py +++ b/sdk/python/feast/infra/offline_stores/remote.py @@ -443,7 +443,16 @@ def get_table_column_names_and_types_from_data_source( return zip(table.column("name").to_pylist(), table.column("type").to_pylist()) -def _create_retrieval_metadata(feature_refs: List[str], entity_df: pd.DataFrame): +def _create_retrieval_metadata( + feature_refs: List[str], entity_df: Optional[pd.DataFrame] = None +): + if entity_df is None: + return RetrievalMetadata( + features=feature_refs, + keys=[], # No entity keys when no entity_df provided + min_event_timestamp=None, + max_event_timestamp=None, + ) entity_schema = _get_entity_schema( entity_df=entity_df, ) diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index 6bc573888fc..bcdf808868b 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -431,6 +431,9 @@ def get_historical_features(self, command: dict, key: Optional[str] = None): # Extract parameters from the internal flights dictionary entity_df_value = self.flights[key] entity_df = pa.Table.to_pandas(entity_df_value) + # Check if this is a mock/empty table (contains only 'key' column) + if len(entity_df.columns) == 1 and "key" in entity_df.columns: + entity_df = None feature_view_names = command["feature_view_names"] name_aliases = command["name_aliases"]