Skip to content

Commit 9552492

Browse files
authored
docs: Add blog post on Feast Oracle Database offline store support (#6114)
* docs: Add blog post on Feast Oracle Database offline store support Signed-off-by: Aniket Paluskar <apaluska@redhat.com> * Corrected slack channel link & removed future plan section Signed-off-by: Aniket Paluskar <apaluska@redhat.com> * Reworded description, minor nits Signed-off-by: Aniket Paluskar <apaluska@redhat.com> * Updated image with Feast text in the hero image Signed-off-by: Aniket Paluskar <apaluska@redhat.com> * Updated image with Feast text in the hero image Signed-off-by: Aniket Paluskar <apaluska@redhat.com> --------- Signed-off-by: Aniket Paluskar <apaluska@redhat.com>
1 parent 661ecc7 commit 9552492

2 files changed

Lines changed: 274 additions & 0 deletions

File tree

Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
---
2+
title: "Feast Meets Oracle: Unlocking Feature Store for Oracle Database Users"
3+
description: Oracle Database is now a fully featured Feast offline store, integrated with Kubernetes-native operators. This enables teams to leverage their existing Oracle infrastructure for scalable, production ML feature engineering.
4+
date: 2026-03-16
5+
authors: ["Aniket Paluskar", "Srihari Venkataramaiah"]
6+
---
7+
8+
<div class="hero-image">
9+
<img src="/images/blog/feast-oracle-offline-store.png" alt="Feast and Oracle Database" loading="lazy">
10+
</div>
11+
12+
# Feast Meets Oracle: Unlocking Feature Store for Oracle Database Users
13+
14+
## The Problem: Your Data Is Already in Oracle — Why Move It?
15+
16+
If you work in a Fortune 500 company, chances are your most valuable data lives in Oracle Database. It is the one of the most widely used enterprise database for a reason — decades of battle-tested reliability, performance, and governance have made it the backbone of mission-critical systems across finance, healthcare, telecommunications, government, and retail.
17+
18+
But here's the friction: when ML teams want to build features for their models, they typically export data *out* of Oracle into some other system — a data lake, a warehouse, a CSV on someone's laptop. That data movement introduces latency, staleness bugs, security blind spots, and an entire class of silent failures that only surface when a model starts degrading in production.
19+
20+
**What if you didn't have to move your data at all?**
21+
22+
With Feast's new Oracle offline store support — now fully integrated into the Feast Kubernetes operator — you can define, compute, and serve ML features directly from your existing Oracle infrastructure. No data migration. No pipeline duct tape. No compromises.
23+
24+
---
25+
26+
## What's New
27+
28+
Oracle Database is now a first-class offline store in Feast, supported across the full stack:
29+
30+
| Layer | What Changed |
31+
|---|---|
32+
| **Python SDK** | `OracleOfflineStore` and `OracleSource` — a complete offline store implementation built on `ibis-framework[oracle]` |
33+
| **Feast Operator (v1 API)** | `oracle` is a validated persistence type in the `FeatureStore` CRD, with Secret-backed credential management |
34+
| **CRD & Validation** | Kubernetes validates `oracle` at admission time — bad configs are rejected before they ever reach the operator |
35+
| **Type System** | Full Oracle-to-Feast type mapping covering `NUMBER`, `VARCHAR2`, `CLOB`, `BLOB`, `BINARY_FLOAT`, `TIMESTAMP`, and more |
36+
| **Documentation** | Reference docs for the [Oracle offline store](https://docs.feast.dev/reference/offline-stores/oracle) and [Oracle data source](https://docs.feast.dev/reference/data-sources/oracle) |
37+
38+
This isn't a thin wrapper or a partial integration. The Oracle offline store supports the complete Feast offline store interface:
39+
40+
- **`get_historical_features`** — point-in-time correct feature retrieval for training datasets, preventing future data leakage
41+
- **`pull_latest_from_table_or_query`** — fetch the most recent feature values
42+
- **`pull_all_from_table_or_query`** — full table scans for batch processing
43+
- **`offline_write_batch`** — write feature data back to Oracle
44+
- **`write_logged_features`** — persist logged features for monitoring and debugging
45+
46+
---
47+
48+
## Why This Matters: Oracle Is Where the Enterprise Lives
49+
50+
Oracle Database isn't just another backend option. It is the database that runs the world's banks, hospitals, supply chains, and telecom networks. When we say "number one enterprise database," we mean it in terms of:
51+
52+
- **Installed base** — More Fortune 100 companies run Oracle than any other database
53+
- **Data gravity** — Petabytes of the world's most regulated, most valuable data already sits in Oracle
54+
- **Operational maturity** — Decades of enterprise features: partitioning, RAC, Data Guard, Advanced Security, Audit Vault
55+
56+
For ML teams in these organizations, the path to production has always involved a painful detour: extract data from Oracle, load it somewhere else, build features there, then figure out how to serve them. Every step in that chain is a potential point of failure, a security review, and a compliance headache.
57+
58+
Feast's Oracle integration eliminates the detour entirely. Your features are computed where your data already has governance, backup, encryption, and access controls in place.
59+
60+
---
61+
62+
## How It Works: From Oracle Table to Production Features
63+
64+
### Step 1: Configure your feature store
65+
66+
Point Feast at your Oracle database in `feature_store.yaml`:
67+
68+
```yaml
69+
project: my_project
70+
registry: data/registry.db
71+
provider: local
72+
offline_store:
73+
type: oracle
74+
host: oracle-db.example.com
75+
port: 1521
76+
user: feast_user
77+
password: ${DB_PASSWORD}
78+
service_name: ORCL
79+
online_store:
80+
path: data/online_store.db
81+
```
82+
83+
Feast supports three Oracle connection modes — `service_name`, `sid`, or `dsn` — so it fits however your DBA has set things up:
84+
85+
```yaml
86+
# Using SID
87+
offline_store:
88+
type: oracle
89+
host: oracle-db.example.com
90+
port: 1521
91+
user: feast_user
92+
password: ${DB_PASSWORD}
93+
sid: ORCL
94+
95+
# Using full DSN
96+
offline_store:
97+
type: oracle
98+
host: oracle-db.example.com
99+
port: 1521
100+
user: feast_user
101+
password: ${DB_PASSWORD}
102+
dsn: "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle-db.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"
103+
```
104+
105+
### Step 2: Define features backed by Oracle tables
106+
107+
```python
108+
from feast import FeatureView, Field, Entity
109+
from feast.types import Float64, Int64
110+
from feast.infra.offline_stores.contrib.oracle_offline_store.oracle_source import OracleSource
111+
from datetime import timedelta
112+
113+
customer = Entity(name="customer_id", join_keys=["customer_id"])
114+
115+
customer_transactions = OracleSource(
116+
name="customer_txn_source",
117+
table_ref="ANALYTICS.CUSTOMER_TRANSACTIONS",
118+
event_timestamp_column="TXN_TIMESTAMP",
119+
)
120+
121+
customer_features = FeatureView(
122+
name="customer_transaction_features",
123+
entities=[customer],
124+
ttl=timedelta(days=30),
125+
schema=[
126+
Field(name="avg_txn_amount_30d", dtype=Float64),
127+
Field(name="txn_count_7d", dtype=Int64),
128+
Field(name="max_txn_amount_90d", dtype=Float64),
129+
],
130+
source=customer_transactions,
131+
)
132+
```
133+
134+
### Step 3: Retrieve features for training
135+
136+
```python
137+
from feast import FeatureStore
138+
import pandas as pd
139+
140+
store = FeatureStore(repo_path=".")
141+
142+
entity_df = pd.DataFrame({
143+
"customer_id": [101, 102, 103, 104],
144+
"event_timestamp": pd.to_datetime(["2026-01-15", "2026-01-16", "2026-02-01", "2026-02-15"]),
145+
})
146+
147+
training_df = store.get_historical_features(
148+
entity_df=entity_df,
149+
features=[
150+
"customer_transaction_features:avg_txn_amount_30d",
151+
"customer_transaction_features:txn_count_7d",
152+
"customer_transaction_features:max_txn_amount_90d",
153+
],
154+
).to_df()
155+
```
156+
157+
Feast performs point-in-time correct joins against Oracle — no future data leaks into your training set, and the query runs *inside* Oracle, not in some external compute engine.
158+
159+
### Step 4: Serve features in production
160+
161+
```python
162+
store.materialize_incremental(end_date=datetime.utcnow())
163+
164+
features = store.get_online_features(
165+
features=[
166+
"customer_transaction_features:avg_txn_amount_30d",
167+
"customer_transaction_features:txn_count_7d",
168+
],
169+
entity_rows=[{"customer_id": 101}],
170+
).to_dict()
171+
```
172+
173+
---
174+
175+
## Kubernetes-Native: The Feast Operator and Oracle
176+
177+
For teams running Feast on Kubernetes, the Feast operator now natively manages Oracle-backed feature stores through the `FeatureStore` custom resource.
178+
179+
### Create a Secret with your Oracle credentials
180+
181+
```yaml
182+
apiVersion: v1
183+
kind: Secret
184+
metadata:
185+
name: oracle-offline-store
186+
type: Opaque
187+
stringData:
188+
oracle: |
189+
host: oracle-db.example.com
190+
port: "1521"
191+
user: feast_user
192+
password: changeme
193+
service_name: ORCL
194+
```
195+
196+
### Define a FeatureStore custom resource
197+
198+
```yaml
199+
apiVersion: feast.dev/v1
200+
kind: FeatureStore
201+
metadata:
202+
name: production-feature-store
203+
spec:
204+
services:
205+
offlineStore:
206+
persistence:
207+
store:
208+
type: oracle
209+
secretRef:
210+
name: oracle-offline-store
211+
```
212+
213+
### Apply and let the operator do the rest
214+
215+
```bash
216+
kubectl apply -f feature-store.yaml
217+
```
218+
219+
The operator validates the configuration against the CRD schema (rejecting invalid types at admission), reads the Secret, merges the Oracle connection parameters into the generated Feast config, and deploys the offline store service. Credential rotation, version upgrades, and config changes are all handled through Kubernetes-native reconciliation — the same operational model your platform team already knows.
220+
221+
Because credentials live in Kubernetes Secrets, they integrate naturally with external secret managers like HashiCorp Vault, AWS Secrets Manager, or Azure Key Vault through standard Kubernetes mechanisms. Oracle credentials never appear in plain text in your manifests or CI/CD logs.
222+
223+
---
224+
225+
## Real-World Use Cases
226+
227+
### Financial Services: Fraud Detection Without Data Movement
228+
229+
A global bank running Oracle for core banking can now build fraud detection features — transaction velocity, merchant category patterns, geographic anomaly scores — directly from their existing Oracle tables. The features stay within the same security perimeter, audit trail, and encryption boundary as the source data. No ETL pipeline to a secondary warehouse means no replication lag and no additional attack surface.
230+
231+
### Healthcare: Predictive Models on Regulated Data
232+
233+
Hospitals and insurers with patient data in Oracle can compute ML features (readmission risk scores, treatment outcome signals, resource utilization patterns) without copying PHI into a less governed system. Feast's feature definitions become the documented lineage trail that compliance teams need.
234+
235+
### Telecommunications: Network Optimization at Scale
236+
237+
Telcos managing billions of CDRs and network metrics in Oracle can build churn prediction, capacity forecasting, and service quality features on top of the data they already have — avoiding the cost and latency of replicating to a separate analytical platform.
238+
239+
### Retail: Demand Forecasting from Point-of-Sale Data
240+
241+
Retailers with Oracle-backed inventory and transaction systems can build demand forecasting and recommendation features without standing up a parallel data infrastructure. Features computed in Oracle can be materialized to the online store for real-time serving at the edge.
242+
243+
---
244+
245+
## Under the Hood: Built on ibis
246+
247+
The Oracle offline store is built on the [ibis framework](https://ibis-project.org/), a portable Python dataframe API that compiles to native SQL for each backend. This means:
248+
249+
- **Queries execute inside Oracle** — ibis translates Feast's retrieval operations into Oracle SQL, pushing computation to where the data lives
250+
- **No intermediate data movement** — results are streamed back as Arrow tables without staging in a temporary system
251+
- **Full Oracle type fidelity** — the type mapping covers the complete spectrum of Oracle data types, including `NUMBER`, `VARCHAR2`, `NVARCHAR2`, `CHAR`, `CLOB`, `NCLOB`, `BLOB`, `RAW`, `BINARY_FLOAT`, `BINARY_DOUBLE`, `DATE`, `TIMESTAMP`, `INTEGER`, `SMALLINT`, and `FLOAT`
252+
- **Automatic DATE-to-TIMESTAMP casting** — Oracle's `DATE` type (which includes time components, unlike SQL standard) is properly handled
253+
254+
---
255+
256+
## Getting Started
257+
258+
Install Feast with Oracle support:
259+
260+
```bash
261+
pip install 'feast[oracle]'
262+
```
263+
264+
For Kubernetes deployments, ensure you're running Feast operator v0.61.0+ with the v1 API.
265+
266+
The full configuration reference, functionality matrix, and data source documentation are available in the Feast docs:
267+
268+
- [Oracle Offline Store Reference](https://docs.feast.dev/reference/offline-stores/oracle)
269+
- [Oracle Data Source Reference](https://docs.feast.dev/reference/data-sources/oracle)
270+
- [Feast Operator Documentation](https://docs.feast.dev/)
271+
272+
---
273+
274+
*Get started with the [Feast documentation](https://docs.feast.dev/) and join the community on [GitHub](https://github.com/feast-dev/feast) and [Slack](https://feastopensource.slack.com/). We'd love to hear how you're using Feast with Oracle.*
3.46 MB
Loading

0 commit comments

Comments
 (0)