You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

问题原因

  1. 数据类型不兼容:np.random.randint生成的是普通numpy整数数组,对应pandas列类型为int64,该类型无法存储None(会被强制转为NaN,但普通整数类型不支持NaN,最终变成异常数值)。
  2. 索引方式错误:data[0, 'ka1']的索引写法不符合pandas规范,无法正确定位单元格赋值。
  3. 特征类型未声明: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:37:36