FeatureSet导入后特征类型反复覆盖问题及规避方法咨询
如何避免FeatureSet导入数据时特征类型被覆盖?
将数据导入FeatureSet后,部分特征类型发生了变更,日志信息如下:
> 2023-07-08 17:29:42,018 [warning] Overriding type of entity 'fn0' from 'int' to 'int32'. This may result in errors or unusable data. > 2023-07-08 17:29:42,018 [warning] Overriding type of entity 'fn1' from 'int' to 'int32'. This may result in errors or unusable data. > 2023-07-08 17:29:42,018 [warning] Overriding type of entity 'fn2' from 'int' to 'int32'. This may result in errors or unusable data. > 2023-07-08 17:29:46,792 [warning] Overriding type of entity 'fn0' from 'int32' to 'int'. This may result in errors or unusable data. > 2023-07-08 17:29:46,792 [warning] Overriding type of entity 'fn1' from 'int32' to 'int'. This may result in errors or unusable data. > 2023-07-08 17:29:46,792 [warning] Overriding type of entity 'fn2' from 'int32' to 'int'. This may result in errors or unusable data.
使用的示例代码如下:
feature_set = fstore.FeatureSet(feature_name, entities=[fstore.Entity("fn0"), fstore.Entity("fn1"), fstore.Entity("fn2")], engine="storey") feature_set.set_targets(targets=[RedisNoSqlTarget(path="redis://redis-fs-test.eu.infra:6379")], with_defaults=False) feature_set.save() ... fstore.ingest(feature_set,dataFrm,overwrite=False)
解决方案
显式指定Entity的数据类型
不要依赖默认类型推断,创建Entity时直接声明目标类型,确保与业务需求和数据集类型完全匹配。例如需要固定为int32时:entities=[fstore.Entity("fn0", dtype="int32"), fstore.Entity("fn1", dtype="int32"), fstore.Entity("fn2", dtype="int32")]这样FeatureSet会锁定使用指定类型,不会被导入数据的类型自动覆盖。
提前对齐数据集特征类型
在执行ingest前,检查并转换dataFrm中对应列的类型,使其与FeatureSet定义一致。以Pandas为例:dataFrm[["fn0", "fn1", "fn2"]] = dataFrm[["fn0", "fn1", "fn2"]].astype("int32")消除类型差异后再导入,可避免自动覆盖逻辑触发。
启用类型检查限制
查看fstore.ingest方法是否有强制 schema 检查的参数(如enforce_schema=True),启用后若类型不匹配会直接报错而非自动覆盖,提前发现问题。同时确认是否存在禁用自动类型推断的配置项,关闭类型自动覆盖逻辑。避免重复定义FeatureSet
不要在save()后重复执行FeatureSet创建代码,如需更新结构,使用官方提供的update()方法,防止重复触发类型推断导致的类型变更。
内容的提问来源于stack exchange,提问作者JIST
相关产品推荐
相关产品推荐

