From 2329257698ad1b71d4e5723971c7e713b89ded28 Mon Sep 17 00:00:00 2001 From: davitbzh Date: Wed, 13 Jul 2022 15:39:24 +0200 Subject: [PATCH 1/8] remove unused import --- .../main/java/com/logicalclocks/hsfs/constructor/FsQuery.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/constructor/FsQuery.java b/java/src/main/java/com/logicalclocks/hsfs/constructor/FsQuery.java index 5caf7d71dc..0140a7d7ad 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/constructor/FsQuery.java +++ b/java/src/main/java/com/logicalclocks/hsfs/constructor/FsQuery.java @@ -22,7 +22,6 @@ import com.logicalclocks.hsfs.ExternalFeatureGroup; import com.logicalclocks.hsfs.Storage; import com.logicalclocks.hsfs.engine.SparkEngine; -import com.logicalclocks.hsfs.metadata.FeatureGroupBase; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; From 0274f1b7828b982363ed1e563e807cdfccca02e4 Mon Sep 17 00:00:00 2001 From: davitbzh Date: Mon, 3 Oct 2022 17:29:41 +0200 Subject: [PATCH 2/8] get_or_create_feature_view --- .../com/logicalclocks/hsfs/FeatureStore.java | 44 ++++++++++++++-- .../hsfs/metadata/FeatureViewApi.java | 14 +++++ python/hsfs/feature_store.py | 52 +++++++++++++++++++ .../fixtures/generate_backend_fixtures.ipynb | 32 ++++++------ 4 files changed, 121 insertions(+), 21 deletions(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java index 3390ee1743..5d41c66577 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java +++ b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java @@ -17,9 +17,11 @@ package com.logicalclocks.hsfs; import com.fasterxml.jackson.annotation.JsonProperty; +import com.logicalclocks.hsfs.constructor.Query; import com.logicalclocks.hsfs.engine.FeatureViewEngine; import com.logicalclocks.hsfs.engine.SparkEngine; import com.logicalclocks.hsfs.metadata.FeatureGroupApi; +import com.logicalclocks.hsfs.metadata.FeatureViewApi; import com.logicalclocks.hsfs.metadata.StorageConnectorApi; import com.logicalclocks.hsfs.metadata.TrainingDatasetApi; import lombok.Getter; @@ -49,6 +51,7 @@ public class FeatureStore { private Integer projectId; private FeatureGroupApi featureGroupApi; + private FeatureViewApi featureViewApi; private TrainingDatasetApi trainingDatasetApi; private StorageConnectorApi storageConnectorApi; private FeatureViewEngine featureViewEngine; @@ -59,6 +62,7 @@ public class FeatureStore { public FeatureStore() { featureGroupApi = new FeatureGroupApi(); + featureViewApi = new FeatureViewApi(); trainingDatasetApi = new TrainingDatasetApi(); storageConnectorApi = new StorageConnectorApi(); featureViewEngine = new FeatureViewEngine(); @@ -253,14 +257,14 @@ public FeatureGroup.FeatureGroupBuilder createFeatureGroup() { } public FeatureGroup getOrCreateFeatureGroup(String name, Integer version) throws IOException, FeatureStoreException { - return featureGroupApi.getOrCreateFeatureGroup(this, name, version, null, null, + return featureGroupApi.getOrCreateFeatureGroup(this, name, version, null, null, null, null, false, null, null, null); } public FeatureGroup getOrCreateFeatureGroup(String name, Integer version, List primaryKeys, boolean onlineEnabled, String eventTime) throws IOException, FeatureStoreException { - return featureGroupApi.getOrCreateFeatureGroup(this, name, version, null, primaryKeys, + return featureGroupApi.getOrCreateFeatureGroup(this, name, version, null, primaryKeys, null, null, onlineEnabled, null, null, eventTime); } @@ -270,7 +274,7 @@ public FeatureGroup getOrCreateFeatureGroup(String name, Integer version, boolean onlineEnabled, String eventTime) throws IOException, FeatureStoreException { - return featureGroupApi.getOrCreateFeatureGroup(this, name, version, null, primaryKeys, + return featureGroupApi.getOrCreateFeatureGroup(this, name, version, null, primaryKeys, partitionKeys, null, onlineEnabled, null, null, eventTime); } @@ -281,7 +285,7 @@ public FeatureGroup getOrCreateFeatureGroup(String name, Integer version, String StatisticsConfig statisticsConfig, String eventTime) throws IOException, FeatureStoreException { - return featureGroupApi.getOrCreateFeatureGroup(this, name, version, description, primaryKeys, + return featureGroupApi.getOrCreateFeatureGroup(this, name, version, description, primaryKeys, partitionKeys, hudiPrecombineKey, onlineEnabled, timeTravelFormat, statisticsConfig, eventTime); } @@ -338,6 +342,38 @@ public FeatureView.FeatureViewBuilder createFeatureView() { return new FeatureView.FeatureViewBuilder(this); } + /** + * Get feature view metadata object or create a new one if it doesn't exist. This method doesn't update + * existing feature view metadata object. + * + * @param name name of the feature view + * @param version version of the feature view + * @return FeatureView + * @throws FeatureStoreException + * @throws IOException + */ + public FeatureView getOrcreateFeatureView(String name, Integer version) throws FeatureStoreException, IOException { + return featureViewApi.getOrCreateFeatureView(this, name, version, null, null, null); + } + + /** + * Get feature view metadata object or create a new one if it doesn't exist. This method doesn't update + * existing feature view metadata object. + * + * @param name name of the feature view + * @param query Query object + * @param version version of the feature view + * @param description description of the feature view + * @param labels list of label features + * @return FeatureView + * @throws FeatureStoreException + * @throws IOException + */ + public FeatureView getOrcreateFeatureView(String name, Query query, Integer version, String description, + List labels) throws FeatureStoreException, IOException { + return featureViewApi.getOrCreateFeatureView(this, name, version, query, description, labels); + } + /** * Get a feature view object from the selected feature store. * diff --git a/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java b/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java index 85c70502ad..f779eaa00a 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java +++ b/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java @@ -119,6 +119,20 @@ public List get(FeatureStore featureStore, String name) throws Feat } } + public FeatureView getOrCreateFeatureView(FeatureStore featureStore, String name, Integer version, Query query, + String description, List labels) + throws FeatureStoreException, IOException { + FeatureView featureView = null; + try { + featureView = get(featureStore, name, version); + } catch (IOException | FeatureStoreException e) { + if (e.getMessage().contains("Error: 404") && e.getMessage().contains("\"errorCode\":270181")) { + featureView = new FeatureView(name, version, query, description, featureStore, labels); + } + } + return featureView; + } + private String addQueryParam(String baseUrl, Map params) { String url = baseUrl + "?"; List paramUrl = params.entrySet().stream().flatMap(entry -> { diff --git a/python/hsfs/feature_store.py b/python/hsfs/feature_store.py index 292df31641..4f09182035 100644 --- a/python/hsfs/feature_store.py +++ b/python/hsfs/feature_store.py @@ -963,6 +963,58 @@ def create_feature_view( ) return self._feature_view_engine.save(feat_view) + def get_or_create_feature_view( + self, + name: str, + query: Query, + version: int, + description: Optional[str] = "", + labels: Optional[List[str]] = [], + transformation_functions: Optional[Dict[str, TransformationFunction]] = {}, + ): + """Get feature view metadata object or create a new one if it doesn't exist. This method doesn't update + existing feature view metadata object. + + # Arguments + name: Name of the feature view to create. + query: Feature store `Query`. + version: Version of the feature view to create. + description: A string describing the contents of the feature view to + improve discoverability for Data Scientists, defaults to empty string + `""`. + labels: A list of feature names constituting the prediction label/feature of + the feature view. When replaying a `Query` during model inference, + the label features can be omitted from the feature vector retrieval. + Defaults to `[]`, no label. + transformation_functions: A dictionary mapping tansformation functions to + to the features they should be applied to before writing out the + vector and at inference time. Defaults to `{}`, no + transformations. + + # Returns: + `FeatureView`: The feature view metadata object. + """ + + try: + return self._feature_view_engine.get(name, version) + except exceptions.RestAPIError as e: + if ( + e.response.json().get("errorCode", "") == 270181 + and e.response.status_code == 404 + ): + feat_view = feature_view.FeatureView( + name=name, + query=query, + featurestore_id=self._id, + version=version, + description=description, + labels=labels, + transformation_functions=transformation_functions, + ) + return self._feature_view_engine.save(feat_view) + else: + raise e + def get_feature_view(self, name: str, version: int = None): """Get a feature view entity from the feature store. diff --git a/python/tests/fixtures/generate_backend_fixtures.ipynb b/python/tests/fixtures/generate_backend_fixtures.ipynb index 22b408dd2d..7d17b83b8f 100644 --- a/python/tests/fixtures/generate_backend_fixtures.ipynb +++ b/python/tests/fixtures/generate_backend_fixtures.ipynb @@ -354,17 +354,12 @@ " fg_2.save(df_2)\n", " \n", " # fv\n", - "\n", - " try:\n", - " self.feature_view = fs.get_feature_view('fv_test')\n", - " except RestAPIError:\n", - " query = fg_1.select_all().join(fg_2.select_all())\n", - " \n", - " self.feature_view = fs.create_feature_view(\n", - " name='fv_test',\n", - " query=query,\n", - " version=1\n", - " )\n", + " query = fg_1.select_all().join(fg_2.select_all())\n", + " self.feature_view = fs.get_or_create_feature_view(\n", + " name='fv_test',\n", + " query=query,\n", + " version=1\n", + " )\n", "\n", " def call(self):\n", " fs.get_feature_view('fv_test')\n", @@ -559,20 +554,23 @@ ], "metadata": { "kernelspec": { - "display_name": "PySpark", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "pysparkkernel" + "name": "python3" }, "language_info": { "codemirror_mode": { - "name": "python", + "name": "ipython", "version": 3 }, + "file_extension": ".py", "mimetype": "text/x-python", - "name": "pyspark", - "pygments_lexer": "python3" + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From cc201702faa76f7f9c8defac7e8caa1f38ae8b75 Mon Sep 17 00:00:00 2001 From: davitbzh <44586065+davitbzh@users.noreply.github.com> Date: Tue, 4 Oct 2022 13:51:10 +0200 Subject: [PATCH 3/8] Update java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java Co-authored-by: kennethmhc --- java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java index 5d41c66577..4a19601beb 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java +++ b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java @@ -352,7 +352,7 @@ public FeatureView.FeatureViewBuilder createFeatureView() { * @throws FeatureStoreException * @throws IOException */ - public FeatureView getOrcreateFeatureView(String name, Integer version) throws FeatureStoreException, IOException { + public FeatureView getOrCreateFeatureView(String name, Integer version) throws FeatureStoreException, IOException { return featureViewApi.getOrCreateFeatureView(this, name, version, null, null, null); } From d1cd2bc3fc367cf21e63a789d5621aeabfb678db Mon Sep 17 00:00:00 2001 From: davitbzh <44586065+davitbzh@users.noreply.github.com> Date: Tue, 4 Oct 2022 13:51:54 +0200 Subject: [PATCH 4/8] Update java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java Co-authored-by: kennethmhc --- java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java index 4a19601beb..ab99cdb7e9 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java +++ b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java @@ -369,7 +369,7 @@ public FeatureView getOrCreateFeatureView(String name, Integer version) throws F * @throws FeatureStoreException * @throws IOException */ - public FeatureView getOrcreateFeatureView(String name, Query query, Integer version, String description, + public FeatureView getOrCreateFeatureView(String name, Query query, Integer version, String description, List labels) throws FeatureStoreException, IOException { return featureViewApi.getOrCreateFeatureView(this, name, version, query, description, labels); } From f8a08dc9a9333b9431564308cbe060ca85481c9a Mon Sep 17 00:00:00 2001 From: davitbzh Date: Tue, 4 Oct 2022 23:00:13 +0200 Subject: [PATCH 5/8] address comments --- .../com/logicalclocks/hsfs/FeatureStore.java | 16 +++++----------- .../hsfs/engine/FeatureViewEngine.java | 13 +++++++++++++ .../hsfs/metadata/FeatureViewApi.java | 14 -------------- python/hsfs/feature_store.py | 4 +--- 4 files changed, 19 insertions(+), 28 deletions(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java index ab99cdb7e9..6d5403c685 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java +++ b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java @@ -21,7 +21,6 @@ import com.logicalclocks.hsfs.engine.FeatureViewEngine; import com.logicalclocks.hsfs.engine.SparkEngine; import com.logicalclocks.hsfs.metadata.FeatureGroupApi; -import com.logicalclocks.hsfs.metadata.FeatureViewApi; import com.logicalclocks.hsfs.metadata.StorageConnectorApi; import com.logicalclocks.hsfs.metadata.TrainingDatasetApi; import lombok.Getter; @@ -51,7 +50,6 @@ public class FeatureStore { private Integer projectId; private FeatureGroupApi featureGroupApi; - private FeatureViewApi featureViewApi; private TrainingDatasetApi trainingDatasetApi; private StorageConnectorApi storageConnectorApi; private FeatureViewEngine featureViewEngine; @@ -62,7 +60,6 @@ public class FeatureStore { public FeatureStore() { featureGroupApi = new FeatureGroupApi(); - featureViewApi = new FeatureViewApi(); trainingDatasetApi = new TrainingDatasetApi(); storageConnectorApi = new StorageConnectorApi(); featureViewEngine = new FeatureViewEngine(); @@ -347,13 +344,12 @@ public FeatureView.FeatureViewBuilder createFeatureView() { * existing feature view metadata object. * * @param name name of the feature view + * @param query Query object * @param version version of the feature view * @return FeatureView - * @throws FeatureStoreException - * @throws IOException */ - public FeatureView getOrCreateFeatureView(String name, Integer version) throws FeatureStoreException, IOException { - return featureViewApi.getOrCreateFeatureView(this, name, version, null, null, null); + public FeatureView getOrCreateFeatureView(String name, Query query, Integer version) { + return featureViewEngine.getOrCreateFeatureView(this, name, version, query, null, null); } /** @@ -366,12 +362,10 @@ public FeatureView getOrCreateFeatureView(String name, Integer version) throws F * @param description description of the feature view * @param labels list of label features * @return FeatureView - * @throws FeatureStoreException - * @throws IOException */ public FeatureView getOrCreateFeatureView(String name, Query query, Integer version, String description, - List labels) throws FeatureStoreException, IOException { - return featureViewApi.getOrCreateFeatureView(this, name, version, query, description, labels); + List labels) { + return featureViewEngine.getOrCreateFeatureView(this, name, version, query, description, labels); } /** diff --git a/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java b/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java index df57b00f93..d218676f8c 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java +++ b/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java @@ -398,4 +398,17 @@ public Map getTags(FeatureView featureView, Integer trainingData throws FeatureStoreException, IOException { return tagsApi.get(featureView, trainingDataVersion); } + + public FeatureView getOrCreateFeatureView(FeatureStore featureStore, String name, Integer version, Query query, + String description, List labels) { + FeatureView featureView = null; + try { + featureView = get(featureStore, name, version); + } catch (IOException | FeatureStoreException e) { + if (e.getMessage().contains("Error: 404") && e.getMessage().contains("\"errorCode\":270181")) { + featureView = new FeatureView(name, version, query, description, featureStore, labels); + } + } + return featureView; + } } diff --git a/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java b/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java index f779eaa00a..85c70502ad 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java +++ b/java/src/main/java/com/logicalclocks/hsfs/metadata/FeatureViewApi.java @@ -119,20 +119,6 @@ public List get(FeatureStore featureStore, String name) throws Feat } } - public FeatureView getOrCreateFeatureView(FeatureStore featureStore, String name, Integer version, Query query, - String description, List labels) - throws FeatureStoreException, IOException { - FeatureView featureView = null; - try { - featureView = get(featureStore, name, version); - } catch (IOException | FeatureStoreException e) { - if (e.getMessage().contains("Error: 404") && e.getMessage().contains("\"errorCode\":270181")) { - featureView = new FeatureView(name, version, query, description, featureStore, labels); - } - } - return featureView; - } - private String addQueryParam(String baseUrl, Map params) { String url = baseUrl + "?"; List paramUrl = params.entrySet().stream().flatMap(entry -> { diff --git a/python/hsfs/feature_store.py b/python/hsfs/feature_store.py index 4f09182035..9b92e8a968 100644 --- a/python/hsfs/feature_store.py +++ b/python/hsfs/feature_store.py @@ -1002,16 +1002,14 @@ def get_or_create_feature_view( e.response.json().get("errorCode", "") == 270181 and e.response.status_code == 404 ): - feat_view = feature_view.FeatureView( + return self.create_feature_view( name=name, query=query, - featurestore_id=self._id, version=version, description=description, labels=labels, transformation_functions=transformation_functions, ) - return self._feature_view_engine.save(feat_view) else: raise e From 255c5aa596c7279a5a9fd852ea08f126f05f96ef Mon Sep 17 00:00:00 2001 From: davitbzh Date: Fri, 14 Oct 2022 10:32:11 +0200 Subject: [PATCH 6/8] WIP --- .../main/java/com/logicalclocks/hsfs/FeatureStore.java | 5 +++-- .../logicalclocks/hsfs/engine/FeatureViewEngine.java | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java index 6d5403c685..df339c21aa 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java +++ b/java/src/main/java/com/logicalclocks/hsfs/FeatureStore.java @@ -348,7 +348,8 @@ public FeatureView.FeatureViewBuilder createFeatureView() { * @param version version of the feature view * @return FeatureView */ - public FeatureView getOrCreateFeatureView(String name, Query query, Integer version) { + public FeatureView getOrCreateFeatureView(String name, Query query, Integer version) + throws FeatureStoreException, IOException { return featureViewEngine.getOrCreateFeatureView(this, name, version, query, null, null); } @@ -364,7 +365,7 @@ public FeatureView getOrCreateFeatureView(String name, Query query, Integer vers * @return FeatureView */ public FeatureView getOrCreateFeatureView(String name, Query query, Integer version, String description, - List labels) { + List labels) throws FeatureStoreException, IOException { return featureViewEngine.getOrCreateFeatureView(this, name, version, query, description, labels); } diff --git a/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java b/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java index d218676f8c..88e7cb3c88 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java +++ b/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java @@ -400,13 +400,19 @@ public Map getTags(FeatureView featureView, Integer trainingData } public FeatureView getOrCreateFeatureView(FeatureStore featureStore, String name, Integer version, Query query, - String description, List labels) { + String description, List labels) + throws FeatureStoreException, IOException { FeatureView featureView = null; try { featureView = get(featureStore, name, version); } catch (IOException | FeatureStoreException e) { if (e.getMessage().contains("Error: 404") && e.getMessage().contains("\"errorCode\":270181")) { - featureView = new FeatureView(name, version, query, description, featureStore, labels); + featureView = new FeatureView.FeatureViewBuilder(featureStore) + .name(name) + .version(version) + .query(query) + .labels(labels) + .build(); } } return featureView; From 31f2af1baf8ed2f72ce787461059978712344f9f Mon Sep 17 00:00:00 2001 From: davitbzh Date: Fri, 14 Oct 2022 15:19:52 +0200 Subject: [PATCH 7/8] java client --- .../com/logicalclocks/hsfs/engine/StreamFeatureGroupEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/main/java/com/logicalclocks/hsfs/engine/StreamFeatureGroupEngine.java b/java/src/main/java/com/logicalclocks/hsfs/engine/StreamFeatureGroupEngine.java index 437b45ef97..c23680bfa7 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/engine/StreamFeatureGroupEngine.java +++ b/java/src/main/java/com/logicalclocks/hsfs/engine/StreamFeatureGroupEngine.java @@ -116,7 +116,7 @@ public void insert(StreamFeatureGroup streamFeatureGroup, S featureData, public StreamFeatureGroup saveFeatureGroupMetaData(StreamFeatureGroup featureGroup, List partitionKeys, String hudiPrecombineKey, Map writeOptions, JobConfiguration sparkJobConfiguration, S featureData) - throws FeatureStoreException, IOException, ParseException { + throws FeatureStoreException, IOException { if (featureGroup.getFeatures() == null) { featureGroup.setFeatures(utils From cc488129b0f96d9528989df24652f47e1a526c6a Mon Sep 17 00:00:00 2001 From: davitbzh Date: Sat, 15 Oct 2022 19:00:49 +0200 Subject: [PATCH 8/8] description --- .../java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java b/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java index 88e7cb3c88..8fe5ef65fe 100644 --- a/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java +++ b/java/src/main/java/com/logicalclocks/hsfs/engine/FeatureViewEngine.java @@ -411,6 +411,7 @@ public FeatureView getOrCreateFeatureView(FeatureStore featureStore, String name .name(name) .version(version) .query(query) + .description(description) .labels(labels) .build(); }