ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Feast 使用 Oracle 数据库作为数据源:OracleSource 完整指南

Feast 使用 Oracle 数据库作为数据源:OracleSource 完整指南 Feast 使用 Oracle 数据库作为数据源OracleSource 完整指南【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast导读本文介绍 Feast开源 AI/ML 特征存储如何通过OracleSource将 Oracle 数据库表接入特征仓库覆盖数据源定义、feature_store.yaml离线存储配置、支持的类型映射、底层 Ibis 读取/写入机制以及使用注意事项。读完本文你将能够独立在特征仓库中声明 Oracle 表为批量数据源完成历史特征检索point-in-time join与离线特征写入并理解该 contrib 数据源的实现边界与限制。一、Oracle 数据源概述Oracle 数据源Oracle data source本质上是 Oracle 数据库中的一张表由**表引用table reference**唯一指定例如TRANSACTION_FEATURES——不带 schema 的裸表名SCHEMA.TABLE——带 schema 限定名的表。在 Feast 的源码中OracleSource继承自DataSource位于 sdk/python/feast/infra/offline_stores/contrib/oracle_offline_store/oracle_source.py其内部通过OracleOptions持有table_ref并在序列化时注册为DataSourceProto.CUSTOM_SOURCE自定义类型。对应的离线存储实现OracleOfflineStore位于 sdk/python/feast/infra/offline_stores/contrib/oracle_offline_store/oracle.py并通过 sdk/python/feast/repo_config.py 中的离线存储注册表以oracle类型名绑定在 sdk/python/feast/init.py 中作为 Feast 顶层 API 对外导出。使用注意免责声明Oracle 数据源属于社区贡献contrib实现并未获得完整的测试覆盖率请勿假定其完全稳定。从仓库结构看contrib/oracle_offline_store/目录下仅有oracle.py与oracle_source.py两个实现文件没有独立的测试目录对比同目录下athena_offline_store、postgres_offline_store等均带tests/子目录这也印证了官方文档中未达到完整测试覆盖的声明。在投入生产前建议自行补充针对目标 Oracle 版本的集成验证。二、定义 Oracle 数据源2.1 基本用法在特征仓库的feature_definitions.py或对应定义文件中通过OracleSource声明一张 Oracle 表from feast.infra.offline_stores.contrib.oracle_offline_store.oracle_source import ( OracleSource, ) driver_stats_source OracleSource( namedriver_hourly_stats, table_refDRIVER_HOURLY_STATS, event_timestamp_columnEVENT_TIMESTAMP, created_timestamp_columnCREATED, )2.2 全部构造参数对照源码OracleSource.__init__见 oracle_source.pyOracleSource完整支持以下参数参数类型默认值说明namestr必填数据源名称在项目内应唯一table_refOptional[str]None表引用如TRANSACTION_FEATURES或SCHEMA.TABLEevent_timestamp_columnOptional[str]None事件时间戳列用于 point-in-time join存入基类的timestamp_fieldcreated_timestamp_columnOptional[str]记录创建时间戳列用于对同一事件时间戳的多行去重field_mappingOptional[Dict[str, str]]None源表列名到特征名的映射字典date_partition_columnOptional[str]日期分区列descriptionOptional[str]None人类可读的描述信息tagsOptional[Dict[str, str]]None任意键值元数据ownerOptional[str]None数据源负责人通常为主维护者邮箱connection_refOptional[ConnectionRef]None按数据源级别的外部凭据引用详见下文其中event_timestamp_column是特征存储的核心概念Feast 依赖该列执行时间点一致性连接point-in-time joins保证训练/推理时使用的特征值与标签在时间上严格对齐不会出现未来泄漏。2.3 定义特征视图声明好数据源后将其接入FeatureView即可供历史特征检索使用from feast import FeatureView, Field from feast.types import Float32, Int64 driver_stats_fv FeatureView( namedriver_hourly_stats, entities[driver], schema[ Field(nameconv_rate, dtypeFloat32), Field(nameacc_rate, dtypeFloat32), Field(nameavg_daily_trips, dtypeInt64), ], sourcedriver_stats_source, ttltimedelta(days7), )2.4 重要提示Oracle 标识符大小写Oracle 会将未加引号的标识符以大写形式存储。请使用 Oracle 实际展示的大小写来引用列名例如未加引号定义的列应写作USER_ID带引号定义的列按创建时的原样如CamelCase。这一点在源码中有两处佐证OracleSource.get_table_column_names_and_types直接调用con.get_schema(self.table_ref)返回 ibis 探测到的真实列名与类型_read_oracle_table的注释明确说明Column names are returned exactly as Oracle stores them. The user is expected to reference columns using the same casing shown by Oracle (e.g.USER_IDfor unquoted identifiers,CamelCasefor quoted).若大小写不匹配SQL 查询将无法命中对应列。这也是使用 Oracle 数据源时最常见的坑之一。三、离线存储配置feature_store.yaml要真正让OracleSource可运行必须在feature_store.yaml中声明oracle类型的离线存储配置。配置类为OracleOfflineStoreConfig见 oracle.pyproject: my_project registry: data/registry.db provider: local offline_store: type: oracle user: my_oracle_user password: my_oracle_password host: localhost port: 1521 # 以下三项service_name / sid / dsn最多只能配置一个 service_name: ORCL # sid: ORCL # dsn: host:port/service_name各配置项说明对照源码中的字段定义与默认值字段类型默认值说明type字面量oracle离线存储类型选择器必须为oracleuserstr必填Oracle 数据库用户名passwordstr必填Oracle 数据库密码hoststrlocalhostOracle 数据库主机portint1521Oracle 数据库端口Oracle 默认监听端口service_nameOptional[str]NoneOracle 服务名与sid、dsn互斥sidOptional[str]NoneOracle SID与service_name、dsn互斥databaseOptional[str]NoneOracle 数据库名dsnOptional[str]NoneOracle DSN 字符串与service_name、sid互斥互斥校验源码中的model_validator会检查service_name、sid、dsn三个字段若同时设置超过一个会抛出ValueError提示 Only one of service_name, sid, or dsn may be set。连接是如何建立的配置解析后get_ibis_connection(config)见 oracle.py会按以下逻辑构造 Ibis Oracle 连接kwargs {} if offline_config.service_name: kwargs[service_name] offline_config.service_name if offline_config.sid: kwargs[sid] offline_config.sid if offline_config.database: kwargs[database] offline_config.database if offline_config.dsn: kwargs[dsn] offline_config.dsn return ibis.oracle.connect( useroffline_config.user, passwordoffline_config.password, hostoffline_config.host, portoffline_config.port, **kwargs, )即基础认证信息user/password/host/port直接来自配置服务名、SID、库名或 DSN 作为附加关键字参数透传给ibis.oracle.connect。按数据源覆盖凭据ConnectionRef与 Feast 其他数据源一致OracleSource也支持通过connection_ref参数在数据源级别声明外部凭据引用详见 docs/reference/data-sources/overview.md适用于多租户部署、凭据隔离与混合离线存储路由等场景。例如from feast.credentials import ConnectionRef oracle_source OracleSource( namedriver_hourly_stats, table_refDRIVER_HOURLY_STATS, event_timestamp_columnEVENT_TIMESTAMP, connection_refConnectionRef( providerkubernetes, nameoracle-creds, namespaceml-team, connection_typeoracle, auth_typesecret, params{service_name: ORCL}, ), )当未设置connection_ref时连接凭据完全来自全局feature_store.yaml中的offline_store配置。四、支持的 Oracle 数据类型与 Feast 类型映射官方文档说明Oracle 数据源通过 ibis Oracle 后端支持标准的 Oracle 数值、字符串、日期与时间戳类型。在源码中这一映射由 sdk/python/feast/type_map.py 的oracle_to_feast_value_type函数完成OracleSource.source_datatype_to_feast_value_type()直接指向该函数。该函数同时处理两类输入ibis 探测返回的类型字符串如int64、float64、timestamp、decimal以及 Oracle 原生类型名且支持decimal(10, 2)这类带参数类型会先截取括号前的主体再查表。具体映射如下Oracle / ibis 类型Feast ValueType说明int8/int16/int32/integer/smallintINT3232 位整数int64INT6464 位整数float16/float32/real/binary_floatFLOAT单精度浮点float64/decimal/number/float/double precision/binary_doubleDOUBLE双精度浮点含NUMBER、DECIMALstring/varchar2/nvarchar2/char/nchar/clob/nclob/longSTRING字符串族binary/blob/raw/long rawBYTES二进制族booleanBOOL布尔timestamp/date/time/intervalUNIX_TIMESTAMP时间戳族nullNULL空类型其他未识别类型STRING兜底策略type_map.get(type_str, ValueType.STRING)两个值得注意的实现细节日期时间类型统一映射为UNIX_TIMESTAMP无论DATE、TIMESTAMP还是TIME最终都归入时间戳类型配合event_timestamp_column使用。NUMBER一律映射为DOUBLEOracle 的NUMBER是通用数值类型Feast 侧统一按双精度浮点处理若你的特征列原本是整数语义如NUMBER(10)存放 ID建议在特征视图 schema 中显式声明Int64类型。与 Feast 内部类型系统的整体对比各批量数据源功能矩阵可参考 docs/reference/data-sources/overview.md其中Oracle未出现在官方矩阵表中——矩阵只覆盖了核心实现File、BigQuery、Snowflake、Redshift与部分 contrib 实现Postgres、Spark、Trino、CouchbaseOracle 作为贡献数据源不在矩阵统计范围内这也再次提示其稳定性边界。DATE 列的特殊处理_read_oracle_table见 oracle.py在读取表时会遍历所有列将 ibis 探测为 date 类型的列强制 cast 为 timestampfor col_name in table.columns: if table[col_name].type().is_date(): casts[col_name] table[col_name].cast(timestamp) if casts: table table.mutate(**casts)这样做的目的是保留 OracleDATE列中的时间部分Oracle 的DATE实际包含时分秒避免在后续时间过滤与 point-in-time join 中丢失精度。五、底层读取与写入机制基于 IbisOracle 离线存储的整体架构与 Feast 其他 contrib 数据源如 Postgres、MSSQL一致都是基于Ibis 表达式框架实现的。核心入口位于 sdk/python/feast/infra/offline_stores/ibis.pyOracleOfflineStore通过注入数据源读取器与数据源写入器两个回调复用了通用的历史特征检索逻辑。5.1 读取_read_oracle_table_build_data_source_reader返回的读取函数接收任意DataSource内部断言其为OracleSource后调用con.table(data_source.table_ref)读取整表并执行上文所述的 DATE→timestamp 转换。该读取器被用于pull_latest_from_table_or_query按实体键 时间戳拉取每条实体的最新特征记录supports_filter_by_created_timestamp True即支持按created_timestamp_column过滤避免同时间戳多行导致的重复get_historical_features执行 point-in-time 历史特征检索。当未传入实体 DataFrame 时还会调用_build_entity_df_from_feature_sources扫描各特征视图源表在日期区间内的数据自动合成实体表pull_all_from_table_or_query按时间区间拉取全量记录如用于导出。5.2 写入_write_data_source_build_data_source_writer返回的写入函数支持两种模式append默认直接con.insert(table_nametable_ref, objtable.to_pandas())追加写入overwrite先con.truncate_table(table_ref)清空再插入此时必须显式传allow_overwriteTrue否则会抛出ValueErrorSet allow_overwriteTrue to truncate and replace data以保护既有数据。该写入器被offline_write_batch复用支撑feast materialize将特征从离线存储物化到在线存储的落库环节。5.3 数据质量监控支持OracleOfflineStore还实现了compute_monitoring_metrics、ensure_monitoring_tables、save_monitoring_metrics、query_monitoring_metrics、get_monitoring_max_timestamp、clear_monitoring_baseline等监控相关方法可在 Oracle 侧自动建表feature / feature_view / feature_service / job 四类监控表并计算数值特征的均值、标准差、分位数p50/p75/p90/p95/p99、直方图以及类别特征的 Top-N 频次分布。这些表通过MERGE INTO ... FROM dual语句以存在即更新、否则插入的方式写入其中直方图等复杂结构以 JSON 字符串存入VARCHAR2(4000)列。六、使用流程速览一个完整的 Oracle 数据源使用流程如下准备 Oracle 表确认表存在、列大小写、事件时间戳列与实体键列就绪未加引号定义的列名均为大写配置feature_store.yaml声明offline_store.type: oracle及 user/password/host/port以及 service_name/sid/dsn 三选一定义数据源与特征视图用OracleSource声明表接入FeatureView或BatchFeatureView注册并应用在特征仓库根目录执行feast apply将数据源与特征视图注册进 Registry历史特征检索通过feature_store.get_historical_features(entity_df..., features[...])获取训练数据集或通过feast materialize将特征写入在线存储后在线读取。安装前提Oracle 数据源依赖 Ibis 的 Oracle 后端与oracledb驱动ibis.oracle.connect依赖 ibis-oracle 后端实现。从源码结构看OracleSource在feast/__init__.py顶层导出安装对应后端驱动后即可从feast.infra.offline_stores.contrib.oracle_offline_store.oracle_source或feast顶层导入。七、总结与注意事项核心 APIOracleSource(name, table_ref, event_timestamp_column, ...)通过表引用含 schema 形式指向 Oracle 表离线存储配置feature_store.yaml中offline_store.type: oracleservice_name/sid/dsn三选一类型体系Oracle 数值/字符串/日期/时间戳类型经 ibis 后端映射为 Feast 标准类型NUMBER→DOUBLEDATE/TIMESTAMP→UNIX_TIMESTAMP未识别类型兜底为STRING标识符大小写Oracle 未加引号标识符存储为大写必须按 Oracle 实际大小写引用列名贡献实现定位Oracle 数据源由社区贡献contrib未获得完整测试覆盖生产使用前务必自行验证与之相关的功能矩阵统计同样未包含 Oracle。如需进一步了解其他批量数据源与 Feast 类型系统的对应关系可继续阅读 docs/reference/data-sources/overview.md 与 docs/reference/type-system.md。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表