Skip to content

Commit 49045a6

Browse files
Merge branch 'master' into feat/databricks-uc-provider
2 parents 664107f + eb042f0 commit 49045a6

36 files changed

Lines changed: 464 additions & 172 deletions

docs/getting-started/architecture/model-inference.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ of model inference):
1717

1818
*Note: online features can be sourced from batch, streaming, or request data sources.*
1919

20-
These three approaches have different tradeoffs but, in general, have significant implementation differences.
20+
These four approaches have different tradeoffs but, in general, have significant implementation differences.
2121

2222
## 1. Online Model Inference with Online Features
2323
Online model inference with online features is a powerful approach to serving data-driven machine learning applications.
@@ -78,7 +78,7 @@ if features.to_dict().get('user_data:model_predictions') is None:
7878
model_predictions = model_server.predict(features)
7979
store.write_to_online_store(feature_view_name="user_data", df=pd.DataFrame(model_predictions))
8080
```
81-
Note that in this case a seperate call to `write_to_online_store` is required when the underlying data changes and
81+
Note that in this case a separate call to `write_to_online_store` is required when the underlying data changes and
8282
predictions change along with it.
8383

8484
```python

docs/getting-started/components/compute-engine.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ functions (UDFs).
88

99
A materialization task abstracts over specific technologies or frameworks that are used to materialize data. It allows
1010
users to use a pure local serialized approach (which is the default LocalComputeEngine), or delegates the
11-
materialization to seperate components (e.g. AWS Lambda, as implemented by the the LambdaComputeEngine).
11+
materialization to separate components (e.g. AWS Lambda, as implemented by the LambdaComputeEngine).
1212

1313
If the built-in engines are not sufficient, you can create your own custom materialization engine. Please
1414
see [this guide](../../how-to-guides/customizing-feast/creating-a-custom-compute-engine.md) for more details.

docs/getting-started/concepts/feast-types.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Feast's type system is built on top of [protobuf](https://github.com/protocolbuf
88
Feast supports the following categories of data types:
99

1010
- **Primitive types**: numerical values (`Int32`, `Int64`, `Float32`, `Float64`), `String`, `Bytes`, `Bool`, and `UnixTimestamp`.
11+
- **Zoned timestamp type**: `ZonedTimestamp` stores a timezone-aware datetime as both the UTC instant and its originating zone, so the original wall-clock zone round-trips losslessly. This differs from `UnixTimestamp`, which is always decoded as UTC and discards the source zone. Use `ZonedTimestamp` when local time-of-day or the offset/zone itself is meaningful. It must be explicitly declared in schema (it is not inferred by any backend), and is not supported as an entity key.
1112
- **Domain-specific primitives**: `PdfBytes` (PDF binary data for RAG/document pipelines) and `ImageBytes` (image binary data for multimodal pipelines). These are semantic aliases over `Bytes` and must be explicitly declared in schema — no backend infers them.
1213
- **UUID types**: `Uuid` and `TimeUuid` for universally unique identifiers. Stored as strings at the proto level but deserialized to `uuid.UUID` objects in Python.
1314
- **Array types**: ordered lists of any primitive type, e.g. `Array(Int64)`, `Array(String)`, `Array(Uuid)`.

docs/getting-started/concepts/feature-view.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ If the `schema` parameter is not specified in the creation of the feature view,
9191

9292
"Entity aliases" can be specified to join `entity_dataframe` columns that do not match the column names in the source table of a FeatureView.
9393

94-
This could be used if a user has no control over these column names or if there are multiple entities are a subclass of a more general entity. For example, "spammer" and "reporter" could be aliases of a "user" entity, and "origin" and "destination" could be aliases of a "location" entity as shown below.
94+
This could be used if a user has no control over these column names or if multiple entities are subclasses of a more general entity. For example, "spammer" and "reporter" could be aliases of a "user" entity, and "origin" and "destination" could be aliases of a "location" entity as shown below.
9595

9696
It is suggested that you dynamically specify the new FeatureView name using `.with_name` and `join_key_map` override using `.with_join_key_map` instead of needing to register each new copy.
9797

@@ -322,4 +322,4 @@ def driver_hourly_stats_stream(df: DataFrame):
322322
)
323323
```
324324

325-
See [here](https://github.com/feast-dev/streaming-tutorial) for a example of how to use stream feature views to register your own streaming data pipelines in Feast.
325+
See [here](https://github.com/feast-dev/streaming-tutorial) for an example of how to use stream feature views to register your own streaming data pipelines in Feast.

docs/getting-started/quickstart.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Feast (Feature Store) is an open-source feature store designed to facilitate the management and serving of machine learning features in a way that supports both batch and real-time applications.
66

7-
* *For Data Scientists*: Feast is a a tool where you can easily define, store, and retrieve your features for both model development and model deployment. By using Feast, you can focus on what you do best: build features that power your AI/ML models and maximize the value of your data.
7+
* *For Data Scientists*: Feast is a tool where you can easily define, store, and retrieve your features for both model development and model deployment. By using Feast, you can focus on what you do best: build features that power your AI/ML models and maximize the value of your data.
88

99
* *For MLOps Engineers*: Feast is a library that allows you to connect your existing infrastructure (e.g., online database, application server, microservice, analytical database, and orchestration tooling) that enables your Data Scientists to ship features for their models to production using a friendly SDK without having to be concerned with software engineering challenges that occur from serving real-time production systems. By using Feast, you can focus on maintaining a resilient system, instead of implementing features for Data Scientists.
1010

docs/reference/data-sources/kafka.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,4 @@ def driver_hourly_stats_stream(df: DataFrame):
7272
```
7373

7474
### Ingesting data
75-
See [here](https://github.com/feast-dev/streaming-tutorial) for a example of how to ingest data from a Kafka source into Feast.
75+
See [here](https://github.com/feast-dev/streaming-tutorial) for an example of how to ingest data from a Kafka source into Feast.

docs/reference/data-sources/kinesis.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ def driver_hourly_stats_stream(df: DataFrame):
7171
```
7272

7373
### Ingesting data
74-
See [here](https://github.com/feast-dev/streaming-tutorial) for a example of how to ingest data from a Kafka source into Feast. The approach used in the tutorial can be easily adapted to work for Kinesis as well.
74+
See [here](https://github.com/feast-dev/streaming-tutorial) for an example of how to ingest data from a Kafka source into Feast. The approach used in the tutorial can be easily adapted to work for Kinesis as well.

docs/reference/online-stores/dynamodb.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ The full set of configuration options is available in [DynamoDBOnlineStoreConfig
2424
2525
## Configuration
2626
27-
Below is a example with performance tuning options:
27+
Below is an example with performance tuning options:
2828
2929
{% code title="feature_store.yaml" %}
3030
```yaml

docs/reference/type-system.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Feast supports the following data types:
2424
| `Bytes` | `bytes` | Binary data |
2525
| `Bool` | `bool` | Boolean value |
2626
| `UnixTimestamp` | `datetime` | Unix timestamp (nullable) |
27+
| `ZonedTimestamp` | `datetime` | Timezone-aware datetime preserving its source zone (nullable) |
2728
| `Uuid` | `uuid.UUID` | UUID (any version) |
2829
| `TimeUuid` | `uuid.UUID` | Time-based UUID (version 1) |
2930
| `Decimal` | `decimal.Decimal` | Arbitrary-precision decimal number |
@@ -202,7 +203,8 @@ from datetime import timedelta
202203
from feast import Entity, FeatureView, Field, FileSource
203204
from feast.types import (
204205
Int32, Int64, Float32, Float64, String, Bytes, Bool, UnixTimestamp,
205-
Uuid, TimeUuid, Decimal, Array, Set, Map, ScalarMap, Json, Struct
206+
Uuid, TimeUuid, Decimal, Array, Set, Map, ScalarMap, Json, Struct,
207+
ZonedTimestamp
206208
)
207209

208210
# Define a data source
@@ -232,6 +234,7 @@ user_features = FeatureView(
232234
Field(name="profile_picture", dtype=Bytes),
233235
Field(name="is_active", dtype=Bool),
234236
Field(name="last_login", dtype=UnixTimestamp),
237+
Field(name="event_time", dtype=ZonedTimestamp),
235238
Field(name="session_id", dtype=Uuid),
236239
Field(name="event_id", dtype=TimeUuid),
237240
Field(name="price", dtype=Decimal),
@@ -362,6 +365,43 @@ unique_prices = {decimal.Decimal("9.99"), decimal.Decimal("19.99"), decimal.Deci
362365
`Decimal` is **not** inferred from any backend schema. You must declare it explicitly in your feature view schema. The pandas dtype for `Decimal` columns is `object` (holding `decimal.Decimal` instances), not a numeric dtype.
363366
{% endhint %}
364367

368+
### ZonedTimestamp Type Usage Examples
369+
370+
The `ZonedTimestamp` type stores a timezone-aware `datetime` as both the UTC instant
371+
and its originating zone, so the original wall-clock zone round-trips losslessly.
372+
By contrast, `UnixTimestamp` always decodes to UTC and discards the source zone.
373+
374+
```python
375+
from datetime import datetime, timezone
376+
from zoneinfo import ZoneInfo
377+
378+
# A datetime in a specific zone — both the instant and "America/Los_Angeles" are kept
379+
event_time = datetime(2026, 6, 17, 9, 0, 0, tzinfo=ZoneInfo("America/Los_Angeles"))
380+
381+
# ZonedTimestamp values are returned as tz-aware datetime objects, in their own zone
382+
response = store.get_online_features(
383+
features=["event_features:event_time"],
384+
entity_rows=[{"user_id": 1001}],
385+
)
386+
result = response.to_dict()
387+
# result["event_time"][0] == event_time (same instant AND same zone, e.g. 09:00-07:00)
388+
389+
# Two values at the same instant but different zones stay distinct
390+
la = datetime(2026, 6, 17, 9, 0, 0, tzinfo=ZoneInfo("America/Los_Angeles"))
391+
utc = datetime(2026, 6, 17, 16, 0, 0, tzinfo=timezone.utc) # same instant as `la`
392+
393+
# A naive (tz-less) datetime is interpreted as UTC
394+
naive = datetime(2026, 6, 17, 12, 0, 0) # stored zone is empty, decoded as UTC
395+
```
396+
397+
{% hint style="warning" %}
398+
`ZonedTimestamp` is **not** inferred from any backend schema — you must declare it
399+
explicitly in your feature view schema. It is not supported as an entity key. The
400+
zone is stored as an IANA name (e.g. `America/Los_Angeles`) when available, falling
401+
back to a fixed-offset string; offline stores that cannot natively carry a zone may
402+
normalize to UTC on that backend.
403+
{% endhint %}
404+
365405
### Nested Collection Type Usage Examples
366406

367407
```python

docs/tutorials/validating-historical-features.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ _ = job.to_df(validation_reference=validation_reference)
661661
02/02/2022 02:43:53 PM INFO: Validating data_asset_name None with expectation_suite_name default
662662

663663

664-
Validation successfully passed as no exception were raised.
664+
Validation successfully passed as no exceptions were raised.
665665

666666

667667
### 5. Validating new historical retrieval

0 commit comments

Comments
 (0)