如何在MLRun的NoSqlTarget中正确写入Integer类型的None值?
在MLRun NoSqlTarget中正确写入Integer类型的None值
问题重现
执行以下代码后,特征ka1的None值并未成功写入NoSqlTarget:
import mlrun import mlrun.feature_store as fstore import pandas as pd import numpy as np project = mlrun.get_or_create_project("test", context='./', user_project=False) feature_name = "test-features" fset = fstore.FeatureSet(feature_name, entities=[fstore.Entity("ka0")], engine="storey") fset.set_targets(targets=[mlrun.datastore.NoSqlTarget()], with_defaults=False) fset.save() data = pd.DataFrame(np.random.randint(low=0, high=500, size=(1, 5)), columns=[f"ka{i}" for i in range(5)]) data[0, 'ka1'] = None # 尝试写入None值 fstore.ingest(fset, data)
问题原因
- 数据类型不兼容:
np.random.randint生成的是普通numpy整数数组,对应pandas列类型为int64,该类型无法存储None(会被强制转为NaN,但普通整数类型不支持NaN,最终变成异常数值)。 - 索引方式错误:
data[0, 'ka1']的索引写法不符合pandas规范,无法正确定位单元格赋值。 - 特征类型未声明:FeatureSet未显式指定
ka1为可空整数类型,MLRun默认按普通整数处理,导致None值被忽略或转换。
解决方案
1. 构建支持None的可空整数DataFrame
使用pandas的Int64(大写I)类型定义列,该类型原生支持存储None,同时用loc正确赋值:
# 创建指定可空整数类型的空DataFrame data = pd.DataFrame(columns=[f"ka{i}" for i in range(5)], dtype="Int64") # 填充随机整数数据 data.loc[0] = np.random.randint(low=0, high=500, size=5).tolist() # 正确给ka1列的第0行赋值None data.loc[0, 'ka1'] = None
2. 在FeatureSet中显式声明可空整数特征
通过features参数指定ka1的类型为NULLABLE_INT64,让MLRun明确识别该特征支持空值:
from mlrun.datastore import ValueType fset = fstore.FeatureSet( feature_name, entities=[fstore.Entity("ka0")], engine="storey", features=[ {"name": "ka1", "value_type": ValueType.NULLABLE_INT64} # 其他特征若需支持空值,可按同样方式添加 ] ) fset.set_targets(targets=[mlrun.datastore.NoSqlTarget()], with_defaults=False) fset.save()
3. 执行数据Ingest
完成上述配置后,正常执行Ingest操作即可将None值正确写入NoSqlTarget:
fstore.ingest(fset, data)
内容的提问来源于stack exchange,提问作者JzD
相关产品推荐
相关产品推荐

