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

如何修改KFP输出Dataset artifact的URI后缀为.csv?

自定义KubeFlow Output[Dataset]的URI后缀及文件名

问题场景

当前使用KubeFlow的Output[Dataset]输出CSV格式数据时,生成的URI为gs://<bucket-name>/<id>/<pipeline-name>+<id>/<script-name>+<id>/dataset,结尾无.csv后缀。手动在dataset.uri后追加.csv会导致后续组件无法直接通过train_data.path引用数据,必须手动拼接后缀,希望利用KFP原生能力解决该问题。

解决方案

方案1:修改Output[Dataset]对象的URI和Path属性

直接在组件函数中修改Dataset对象的uri和path属性,让KFP后续引用时直接获取带后缀的路径:

def extract_bq_to_dataset(
    bq_client_project_id: str,
    source_project_id: str,
    dataset_id: str,
    table_name: str,
    dataset: Output[Dataset],
    dataset_location: str = "EU",
    extract_job_config: dict = None,
    ):
    from google.cloud import bigquery
    from google.cloud.exceptions import GoogleCloudError

    # 自定义带.csv后缀的URI和Path
    csv_uri = dataset.uri + ".csv"
    csv_path = dataset.path + ".csv"
    # 更新Dataset对象的属性
    dataset.uri = csv_uri
    dataset.path = csv_path
    # 可选:自定义文件名(如training_data.csv)
    # dataset.name = "training_data.csv"

    full_table_id = f"{source_project_id}.{dataset_id}.{table_name}"
    table = bigquery.table.Table(table_ref=full_table_id)

    if extract_job_config is None:
        extract_job_config = {}
    job_config = bigquery.job.ExtractJobConfig(**extract_job_config)

    client = bigquery.Client(project=bq_client_project_id, location=dataset_location)
    extract_job = client.extract_table(
        source=table,
        destination_uris=csv_uri,
        job_config=job_config,
        location=dataset_location,
    )

    try:
        result = extract_job.result()
    except GoogleCloudError as e:
        raise e

修改后,后续组件引用该Dataset时,train_data.path和train_data.uri都会直接返回带.csv后缀的路径,无需手动拼接。

方案2:组件定义时指定输出文件名

使用KFP的@dsl.component装饰器,通过OutputPath的file_name参数直接指定输出文件名:

@dsl.component(
    base_image="python:3.9",
    packages_to_install=["google-cloud-bigquery"],
    outputs={
        "dataset": dsl.OutputPath(type=Dataset, file_name="training_data.csv")
    }
)
def extract_bq_to_dataset(
    bq_client_project_id: str,
    source_project_id: str,
    dataset_id: str,
    table_name: str,
    dataset_location: str = "EU",
    extract_job_config: dict = None,
    ):
    from google.cloud import bigquery
    from google.cloud.exceptions import GoogleCloudError

    # 获取KFP生成的带指定文件名的路径
    dataset_path = dsl.get_output_path("dataset")
    csv_uri = f"gs://{dataset_path.lstrip('/')}"

    full_table_id = f"{source_project_id}.{dataset_id}.{table_name}"
    table = bigquery.table.Table(table_ref=full_table_id)

    if extract_job_config is None:
        extract_job_config = {}
    job_config = bigquery.job.ExtractJobConfig(**extract_job_config)

    client = bigquery.Client(project=bq_client_project_id, location=dataset_location)
    extract_job = client.extract_table(
        source=table,
        destination_uris=csv_uri,
        job_config=job_config,
        location=dataset_location,
    )

    try:
        result = extract_job.result()
    except GoogleCloudError as e:
        raise e

这种方式下,KFP会自动生成包含指定文件名(如training_data.csv)的URI和路径,后续组件直接引用输出即可。

内容的提问来源于stack exchange,提问作者hjerp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:17:43