0.3 to 0.4 Upgrade Guide
What's new in 0.4
Tecton 0.4 includes the next generation feature definition framework with native support for Snowflake transformations. The major goal for this release is to simplify core concepts, while increasing flexibility and maintaining high performance.
Tecton 0.4 includes many updates and improvements. For a full list see the Tecton 0.4 Release Notes.
0.3 and 0.4 side-by-side comparison
Tecton version 0.4 introduces new classes which replace classes that were available in version 0.3. The following tables list the mapping between 0.3 and 0.4 classes, parameters, and methods.
Class Renames/Changes
0.3 Definition | 0.4 Definition |
---|---|
Data Sources | |
BatchDataSource | BatchSource |
StreamDataSource | StreamSource |
RequestDataSource | RequestSource |
Data Source Configs | |
FileDSConfig | FileConfig |
HiveDSConfig | HiveConfig |
KafkaDSConfig | KafkaConfig |
KinesisDSConfig | KinesisConfig |
RedshiftDSConfig | RedshiftConfig |
SnowflakeDSConfig | SnowflakeConfig |
Feature Views | |
@batch_window_aggregate_feature_view | @batch_feature_view |
@stream_window_aggregate_feature_view | @stream_feature_view |
Misc Classes | |
FeatureAggregation | Aggregation |
New Classes | |
- | AggregationMode |
- | KafkaOutputStream |
- | KinesisOutputStream |
- | FilteredSource |
Deprecated Classes in 0.3 | |
Input | - |
BackfillConfig | - |
MonitoringConfig | - |
Feature View/Table Parameter Changes
0.3 Definition | 0.4 Definition | Type Changes |
---|---|---|
inputs | sources | Dict -> List of Data Sources or Filtered Source |
name_override | name | |
aggregation_slide_period | aggregation_interval | str -> datetime.timedelta |
timestamp_key | timestamp_field | |
batch_cluster_config | batch_compute | |
stream_cluster_config | stream_compute | |
online_config | online_store | |
offline_config | offline_store | |
output_schema | schema | See release notes for type changes |
batch_schedule, ttl, max_batch_aggregation_interval | str -> datetime.timedelta | |
family | - (removed) | |
schedule_offset(nested in Input) | - (removed, see DataSource data_delay) | |
window(nested in Input) | - (removed, see start_time_offset) | |
- | start_time_offset (window - Feature View's batch_schedule) | |
monitoring.alert_email (nested in MonitoringConfig) | alert_email | |
monitoring.monitor_freshness (nested in MonitoringConfig) | monitor_freshness | |
monitoring.expected_feature_freshness (nested in MonitoringConfig) | expected_feature_freshness | str -> datetime.timedelta |
Data Source Parameter Changes
0.3 Definition | 0.4 Definition | Type Changes |
---|---|---|
Data Sources | ||
batch_ds_config | batch_config | |
stream_ds_config | stream_config | |
request_schema | schema | See release notes for type changes |
Data Sources Configs | ||
timestamp_column_name | timestamp_field | |
timestamp_field | timestamp_field | |
raw_batch_translator | post_processor | |
raw_stream_translator | post_processor | |
default_watermark_delay_threshold | watermark_delay_threshold | str -> datetime.timedelta |
default_initial_stream_position | initial_stream_position | |
schedule_offset (defined in Feature View) | data_delay |
Interactive Method Changes
In addition to declarative classes, interactive FeatureView and FeatureTable methods with overlapping functionality have been consolidated.
0.3 Interactive Method | 0.4 Interactive Method |
---|---|
get_historical_features | get_historical_features |
preview | get_historical_features |
get_feature_dataframe | get_historical_features |
get_features | get_historical_features |
get_online_features | get_online_features |
get_feature_vector | get_online_features |
run | run* |
*arguments have changed in 0.4
Incremental upgrades from 0.3 to 0.4
Feature repository updates and CLI updates can be decoupled using the compat
library for 0.3 feature definitions. Feature definitions using the 0.3 objects can continue to be used after updating to 0.4 CLI when imports are migrated to the compat
module. 0.3 objects cannot be applied using tecton~=0.4
without changing from tecton
import paths to from tecton.compat
. For example:
# 0.3 object imports can only be applied using tecton 0.3
from tecton import Entity
# 0.3 object imports from `compat` can be applied using tecton 0.4
from tecton.compat import Entity
See the table below for a compatibility matrix.
CLI 0.3 | CLI 0.4 | |
---|---|---|
Framework 0.3 | from tecton import (as normal) |
from tecton.compat import required |
Framework 0.4 | Not supported | from tecton import (as normal) |
⚠️ Important: 0.4 Feature Services and Feature Views
The format of feature column names for offline features has changed from feature_view_name.feature_name
to feature_view_name__feature_name
. Feature view names cannot contain double underscores. Online feature columns will continue to use the format feature_view_name.feature_name
.
Steps to upgrade to the Tecton 0.4 CLI
The steps below will allow you to upgrade the 0.3 CLI to the 0.4 CLI and use the 0.4 CLI with a 0.3 feature repo.
1. Verify the repo is a version 0.3 repo
pip install tecton~=0.3.0
and run tecton plan
. This should yield no diffs before beginning the migration.
2. Migrate imports to the compat
library
Update all imports from the tecton
module that are found in the 0.3.0 column of the table above to import from tecton.compat
instead. This is important! You should only update 0.3.0 classes to import from tecton.compat
. Do not run tecton apply
yet!
3. Upgrade your CLI to 0.4
Install tecton~=0.4.0
and run tecton plan
. This should yield no diffs.
4. Congrats!
You now have a 0.3 repo compatible with the 0.4 CLI.
Upgrade the 0.3 feature repo to use 0.4 Tecton object definitions
Once you've upgraded to the Tecton 0.4 CLI and updated the 0.3 feature repo to make it compatible with the 0.4 CLI, you can begin updating the feature repo to use 0.4 Tecton object definitions.
The fundamentals of 0.3 and 0.4 are similar except for class and parameter names. Most upgrades will require light refactoring of each Tecton object definition, refer to the class and parameter changes above. However, there are specific scenarios detailed below that require additional steps and refactoring particularly to avoid re-materializing data. Please read them carefully before upgrading your feature repo. Note: Objects must be semantically identical when doing an upgrade; no property changes can be combined with an upgrade.
Important: With the exception of Feature Services, 0.3 objects can only depend on 0.3 objects, and 0.4 objects can only depend on 0.4 objects. Feature repos can be upgraded incrementally, but Feature Views must be upgraded in lock-step with any upstream dependencies (Transformations, Entities, Data Sources).
Upgrade Feature Views with Aggregations
Note
When following this upgrade procedure, feature data will not be rematerialized.
In 0.3, in a Batch Window Aggregate Feature View or a Stream Window Aggregate Feature View, multiple time_windows
can be specified in the FeatureAggregation
definition that is used in the aggregations
parameter of the Feature View. For example:
...
aggregations=[FeatureAggregation(column='transaction', function='count', time_windows=['24h','30d','90d'])],
...
In 0.4, FeatureAggregation
has been replaced with Aggregation
, which only supports one time window per definition; when upgrading you must use multiple Aggregation
definitions if there are multiple time windows. Maintain the same ordering of aggregations when upgrading your Feature View.
Additionally, when upgrading, for each Aggregation
you must specify the name
parameter, which uses the format <column>_<function>_<time window>_<aggregation interval>
where:
<column>
is thecolumn
value in the 0.3FeatureAggregation
<function>
is thefunction
value in the 0.3FeatureAggregation
<time window>
is one of the elements in thetime_windows
list in the 0.3FeatureAggregation
<aggregation interval>
is the value of theaggregation_interval
(in string format), in the 0.4Aggregation
For example, to upgrade the aggregations
example above, where the value of aggregation_interval
is timedelta(days=1)
rewrite aggregations
to:
...
aggregations=[
Aggregation(column='transaction', function='count', time_window=timedelta(days=1), name="transaction_count_24h_1d"),
Aggregation(column='transaction', function='count', time_window=timedelta(days=30), name="transaction_count_30d_1d"),
Aggregation(column='transaction', function='count', time_window=timedelta(days=90), name="transaction_count_90d_1d")
],
...
name
parameter as explained above, the 0.4 feature output column names will remain the same as the 0.3 definition.
Upgrade Feature Views containing the window
parameter in Input
object definitions
Note
When following this upgrade procedure, feature data will not be rematerialized.
In 0.3, an Input
in a Feature View can have a window
that defines how long to look back for data from the current time.
In 0.4, a FilteredSource
can define a start_time_offset
(the equivalent of window
), which pre-filters the Data Source to the time range beginning with start_time
+ start_time_offset
of the current materialization window, and ending with end_time
of the current materialization window.
To upgrade to FilteredSource
, set start_time_offset = -1 * (window - batch_schedule)
, where window
is from the 0.3 Input
definition and batch_schedule
is from the Feature View definition. If your previous window was WINDOW_UNBOUNDED_PRECEDING,
then set the start_time_offset=timedelta.min.
For a concrete example, refer to Example 4 in the section below.
Upgrade Feature Views containing schedule_offset
Note
When following this upgrade procedure, feature data will not be rematerialized.
In 0.3, the inputs
parameter of a Feature View can optionally specify a schedule_offset
as follows:
inputs={'transactions': Input(transactions_batch, schedule_offset='1hr')}
schedule_offset
specifies how long to wait after the end of the batch_schedule
period before starting the next materialization job. This parameter is typically used to ensure that all data has landed, and in most cases should be the same for all Feature View Input
s that use the same Data Source.
In 0.4, the equivalent parameter, data_delay
, is configured in the config object (such as HiveConfig
and FileConfig
) that is referenced in a Data Source.
Check the schedule_offset
for all Feature Views that use a given Data Source and follow the steps below based on whether they are currently equivalent. Note: Follow the second set of instructions if
schedule_offset
is only set in some Feature View Input
s that use the same Data Source.
If all Feature View Input
s referring to a given Data Source use the same schedule_offset
value
-
Upgrade the Data Source to 0.4 and set the
data_delay
parameter of the Data Source config object to the value ofschedule_offset
defined in the Feature Views. Runtecton apply
with these changes. You should see an output similar to the following:$ tecton apply Using workspace "my_workspace" on cluster https://my_app.tecton.ai ✅ Imported 1 Python modules from the feature repository ✅ Collecting local feature declarations ✅ Performing server-side feature validation: Finished generating plan. ↓↓↓↓↓↓↓↓↓↓↓↓ Plan Start ↓↓↓↓↓↓↓↓↓↓ ~ Upgrade BatchDataSource to the latest Tecton framework name: transactions_batch description: Batch Data Source for transactions_stream ~ Upgrade StreamDataSource to the latest Tecton framework name: transactions_stream description: Kafka Data Source with transaction data ↑↑↑↑↑↑↑↑↑↑↑↑ Plan End ↑↑↑↑↑↑↑↑↑↑↑↑
-
Feature Views using that Data Source can be incrementally upgraded at any time.
If Feature View Input
s referring to a given Data Source use different schedule_offset
values
If the Input
s referring to the same Data Source use different schedule_offset
values, verify, as required by your use case, if they can be updated to the same value. Note: Stream Feature Views cannot use different schedule_offset
values for the same Stream Data Source without re-materializing data.
Note
For most use cases, the Input
s referring to the same Data Source can use the same schedule_offset
value. Using the same value is desireable because the upgrade from a 0.3 to a 0.4 Feature View is simpler.
If one schedule_offset
value can be used for all usages of the Data Source, follow these steps:
-
Prior to upgrading each of the Feature Views to 0.4, update all occurrences of
schedule_offset
inInput
for a particular Data Source to use the same value. To avoid re-materializing the data for this Feature View, runtecton apply --suppress-recreates
.You should get an output similar the following:
$tecton plan --suppress-recreates Using workspace "my_workspace" on cluster https://my_app.tecton.ai ✅ Imported 1 Python modules from the feature repository ✅ Collecting local feature declarations ✅ Performing server-side feature validation: Finished generating plan. ↓↓↓↓↓↓↓↓↓↓↓↓ Plan Start ↓↓↓↓↓↓↓↓↓↓ ~ Update BatchFeatureView name: user_has_great_credit description: Whether the user has a great credit score (over 740). pipeline.root.transformation_node.inputs[0].node.data_source_node.schedule_offset: 1h -> 2h materialization: No new materialization jobs ↑↑↑↑↑↑↑↑↑↑↑↑ Plan End ↑↑↑↑↑↑↑↑↑↑↑↑
-
Upgrade the Data Source object to the 0.4 (non-compat) definition and set the
data_delay
parameter of the Data Source config object to the value ofschedule_offset
. Feature Views using the Data Source can be upgraded incrementally at any time.
If all Input
objects that refer to the same Data Source cannot use the same schedule_offset
value, then each Input
object containing a unique schedule_offset
value will require a separate Data Source.
The following example describes how to upgrade from features views that require the use of multiple schedule_offset
to Data Sources that use data_delay
.
Suppose you have three feature views, as follows, where each Input
object uses the transactions_batch
data source with a different schedule_offset
value:
...
inputs={'transactions': Input(transactions_batch)},
...
...
inputs={'transactions': Input(transactions_batch, schedule_offset='1hr')},
...
...
inputs={'transactions': Input(transactions_batch, schedule_offset='2hr')},
...
-
Make two copies of the source file containing the
transactions_batch
compat Data Source. In the copied source files, replacetransactions_batch
withtransactions_batch_copy_1
andtransactions_batch_copy_2
. -
Update the
Input
object definition in two of the features views, replacingtransactions_batch
with the new name.... inputs={'transactions': Input(transactions_batch)}, ...
... inputs={'transactions': Input(transactions_batch_copy_1, schedule_offset='1hr')}, ...
... inputs={'transactions': Input(transactions_batch_copy_2, schedule_offset='2hr')}, ...
-
Apply your changes with
tecton apply
. If upgrading Batch Feature Views, you can use thesuppress-recreates
flag to avoid re-materializing data.The
suppress-recreates
flag for Stream Feature Views, you must re-materialize data if you need differentschedule_offset
values.You can see the two new Data Sources were created and the corresponding feature views were updated in the plan output below:
$tecton apply --suppress-recreates Using workspace "my_workspace" on cluster https://my_app.tecton.ai ✅ Imported 26 Python modules from the feature repository ✅ Collecting local feature declarations ✅ Performing server-side feature validation: Finished generating plan. ↓↓↓↓↓↓↓↓↓↓↓↓ Plan Start ↓↓↓↓↓↓↓↓↓↓ + Create BatchDataSource name: transactions_batch_copy_1 description: Copy of transactions_batch with offset 1hr + Create BatchDataSource name: transactions_batch_copy_2 description: Copy of transactions_batch with offset 2hr ~ Update BatchFeatureView name: feature_view_2 description: Feature View with schedule_offset of 1hr DependencyChanged(VirtualDataSource): -> transactions_batch_copy_1 materialization: No new materialization jobs ~ Update BatchFeatureView name: feature_view_3 description: Feature View with schedule_offset of 2hr DependencyChanged(VirtualDataSource): -> transactions_batch_copy_2 materialization: No new materialization jobs ↑↑↑↑↑↑↑↑↑↑↑↑ Plan End ↑↑↑↑↑↑↑↑↑↑↑↑
-
Upgrade the three Data Sources to 0.4 (non-compat). During this process, set the
data_delay
value in each Data Source to the correspondingschedule_offset
value in the Feature View which refers to that Data Source.transactions_batch = BatchSource( ... batch_config=HiveConfig( database='transactions', #No data delay needed ), ... )
transactions_batch_copy_1 = BatchSource( ... batch_config=HiveConfig( database='transactions', data_delay=time_delta(hours=1), ), ... )
transactions_batch_copy_2 = BatchSource( ... batch_config=HiveConfig( database='transactions', data_delay=time_delta(hours=2), ), ... )
-
Upgrade the three Feature Views to non-compat 0.4. They can be upgraded all at once, or incrementally. For example,
... inputs={'transactions': Input(transactions_batch, schedule_offset='1hr')}, ...
becomes:
... sources=FilteredSource(transactions_batch), ...
Upgrade Feature Views that use tecton_sliding_window
In 0.4, tecton_sliding_window
is deprecated, and no longer managed by Tecton.
Note
We recommend migrating away from tecton_sliding_window
and using incremental backfills in 0.4. Please reach out to customer success for more information.
We have provided an implementation of the tecton_sliding_window
transformation in this repository. You can copy and paste that transformation into your repository and continue to maintain it. Follow
the instructions in the repository README to upgrade.
Examples of upgrading 0.3 objects to 0.4 objects
Example 1: Converting a 0.3 BatchDataSource to a 0.4 BatchSource
|
|
Example 2: Converting a 0.3 StreamDataSource to a 0.4 StreamSource
|
|
Example 3: Converting a 0.3 Stream Window Aggregate Feature View to a 0.4 Stream Feature View
|
|
Example 4: Converting a 0.3 Batch Feature View (non-aggregate) to a 0.4 Batch Feature View
|
|
Example 5: Converting a 0.3 Feature Table to a 0.4 Feature Table
|
|
Example 6: Converting a 0.3 On-Demand Feature View to a 0.4 On-Demand Feature View
|
|
FAQs
How do Batch/Stream Window Aggregate Feature Views in 0.3 map to 0.4 Feature Views?
A 0.4 batch_feature_view
that has the aggregations
and aggregation_interval
parameters set will behave the same as a 0.3 batch_window_aggregate_feature_view
(the same is true for stream_feature_view
). See the Time-Windowed Aggregations Guide for more info
When should I use incremental backfills?
When Tecton's built-in aggregations aren't an option, using incremental_backfills=True
will instruct Tecton to execute your query every batch_schedule
with each job being responsible for a single time-window aggregation. See the Incremental Backfill guide for more information.
When should I use FilteredSource
?
FilteredSource
should be used whenever possible for Spark users (Databricks or EMR) to push down time filtering to Data Sources. This will make incremental materialization jobs much more efficient since costly scans across long time ranges can be avoided.
How long will Tecton 0.3 be supported for?
See Release Notes for more details.