使用ImportSchemaGen导入Schema至ML Metadata时遇AlreadyExistsError求助
问题解决思路
报错原因分析
这个AlreadyExistsError是因为ML Metadata中已存在一个类型ID为18、名称为schema的Artifact,ML Metadata对(type_id, name)组合有唯一约束,重复导入同名同类型的Schema会触发约束冲突。
可行解决方案
方案1:清理ML Metadata存储
如果使用本地SQLite作为元数据存储(TFX默认配置),直接删除生成的metadata.sqlite文件,再重新运行导入即可。这种方式简单直接,适合测试环境。
方案2:修改组件输出的Artifact名称
自定义ImportSchemaGen的输出通道名称,避免和已存在的Artifact冲突:
from tfx.types import Channel, Artifact # 自定义输出通道,指定不同的名称 custom_schema_channel = Channel(type=Artifact(type_name='Schema')) custom_schema_channel.add_artifact(Artifact(type_name='Schema', name='custom_schema')) user_schema_importer = tfx.components.ImportSchemaGen( schema_file=schema_file, outputs={'result': custom_schema_channel} ) context.run(user_schema_importer, enable_cache=False) context.show(user_schema_importer.outputs['result'])
方案3:手动删除已存在的Artifact
通过ML Metadata API连接存储,手动删除冲突的Artifact:
from ml_metadata.metadata_store import MetadataStore from ml_metadata.proto import metadata_store_pb2 # 配置元数据存储连接(根据实际情况调整) connection_config = metadata_store_pb2.ConnectionConfig() connection_config.sqlite.filename_uri = 'metadata.sqlite' connection_config.sqlite.connection_mode = 3 # READWRITE_OPENCREATE store = MetadataStore(connection_config) # 查询并删除冲突Artifact artifacts = store.get_artifacts_by_type_and_name(18, 'schema') for artifact in artifacts: store.delete_artifacts([artifact.id])
执行完这段代码后,重新运行导入代码即可。
原问题信息
我想为我的Schema生成统计信息,但首先需要将整理好的Schema文件导入ML Metadata,却持续报错。我甚至尝试过已弃用的ImporterNode,但仍无效果。
尝试的代码
user_schema_importer = tfx.components.ImportSchemaGen( schema_file = schema_file ) context.run(user_schema_importer, enable_cache=False) context.show(user_schema_importer.outputs['result'])
报错信息
--------------------------------------------------------------------------- AlreadyExistsError Traceback (most recent call last) <ipython-input-45-ed19f846783e> in <module> 10 11 # Run the component ---> 12 context.run(user_schema_importer, enable_cache=False) 13 14 ### END CODE HERE ### 9 frames /usr/local/lib/python3.7/dist-packages/ml_metadata/metadata_store/metadata_store.py in _pywrap_cc_call(self, method, request, response) 238 self._metadata_store, request.SerializeToString()) 239 if status_code != 0: ---> 240 raise _make_exception(error_message.decode('utf-8'), status_code) 241 response.ParseFromString(response_str) 242 AlreadyExistsError: 指定节点已存在:type_id: 18 uri: "./pipeline/ImportSchemaGen/schema/7" custom_properties { key: "name" value { string_value: "schema" } } custom_properties { key: "producer_component" value { string_value: "ImportSchemaGen" } } } name: "schema" INTERNAL: 无法为以下内容创建节点:type_id: 18 uri: "./pipeline/ImportSchemaGen/schema/7" custom_properties { key: "name" value { string_value: "schema" } } custom_properties { key: "producer_component" value { string_value: "ImportSchemaGen" } } name: "schema"执行查询时出错:UNIQUE约束失败:Artifact.type_id, Artifact.name 查询语句: INSERT INTO `Artifact`( `type_id`, `uri`, `state`, `name`, `create_time_since_epoch`, `last_update_time_since_epoch` ) VALUES(18, './pipeline/ImportSchemaGen/schema/7', NULL, 'schema', 1662549196604, 1662549196604);
内容的提问来源于stack exchange,提问作者Chuka
相关产品推荐
相关产品推荐

