1

我在这里阅读“参数” ,想知道我是否可以定义目录级别的参数,以便以后在目录源的定义中使用?

考虑一个简单的 YAML 目录,它有两个来源:

sources:
  data1:
    args:
      urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data1.csv"
    description: ''
    driver: intake.source.csv.CSVSource
    metadata: {}
    
  data2:
    args:
      urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data2.csv"
    description: ''
    driver: intake.source.csv.CSVSource
    metadata: {}

请注意,两个数据源(data1 和 data2)都使用snapshot_date参数内的urlpath参数?有了这个定义,我可以加载数据源:

cat = intake.open_catalog("./catalog.yaml")
cat.data1(snapshot_date="latest").read()   # reads from data/latest/data1.csv
cat.data2(snapshot_date="20211029").read() # reads from data/20211029/data2.csv

请注意,这cat.data1().read()不起作用,因为snapshot_date默认为空字符串,因此 csv 驱动程序找不到路径“./data//data1.csv”。

我可以通过向每个(!)源添加部分来设置默认值,parameters如下所示。

sources:
  data1:
    parameters:
      snapshot_date:
        type: str
        default: "latest"
        description: ""
    args:
      urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data1.csv"
    description: ''
    driver: intake.source.csv.CSVSource
    metadata: {}
    
  data2:
    parameters:
      snapshot_date:
        type: str
        default: "latest"
        description: ""
    args:
      urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data2.csv"
    description: ''
    driver: intake.source.csv.CSVSource
    metadata: {}

但这看起来很复杂(太多重复的代码)并且对最终用户来说有点不方便——如果用户想要从给定日期加载所有数据源,他必须snapshot_date在初始化时显式地为每个(!)数据源提供参数。IMO,如果我用户可以在初始化目录时提供一次这个值,那就太好了。

有没有办法可以snapshot_date在目录级别定义参数?以便:

  • 我可以在目录参数的 YAML 定义中设置默认值(例如,在我的示例中为“最新”)
  • 或者可以在调用期间在运行时传递目录的参数值intake.open_catalog("./catalog.yaml", snapshot_date="20211029")
  • 在该目录的数据源定义中应该可以访问该值吗?
cat = intake.open_catalog("./catalog.yaml", snapshot_date="20211029")
cat.data1.read()  # will return data from ./data/20211029/data1.csv
cat.data2.read()  # will return data from ./data/20211029/data2.csv
cat.data2(snapshot_date="latest").read()  # will return data from ./data/latest/data1.csv

cat = intake.open_catalog("./catalog.yaml")
cat.data1.read()  # will return data from ./data/latest/data1.csv
cat.data2.read()  # will return data from ./data/latest/data2.csv

提前致谢

4

2 回答 2

2

这个想法之前已经提出过(https://github.com/intake/intake/pull/562https://github.com/intake/intake/issues/511),我有一个暗示可能是https:// /github.com/zillow/intake-nested-yaml-catalog支持您所要求的内容。

但是,我完全支持在 Intake 中添加此功能,无论是基于 #562,上面还是其他。将它添加到基本目录和 YAML 文件目录应该很容易,但要让它适用于所有子类可能会很棘手。

目前,您可以使用环境变量来实现您想要的,例如“{{snapshot_date}}”->“{{env(SNAPSHOT_DATE)}}”,但您需要与用户沟通应该设置此变量。此外,如果该值不在字符串中使用,您仍需要一个参数定义来强制转换为正确的类型。

于 2021-11-01T13:27:23.017 回答
0

This is a bit of a hack, but consider a yaml file with this content:

global_params:
  snapshot_date: &global
    default: latest
    description: ''
    type: str

sources:
  data1:
    args:
      urlpath: '{{CATALOG_DIR}}/data/{{snapshot_date}}/data1.csv'
    description: ''
    driver: intake.source.csv.CSVSource
    metadata: {}
    parameters:
      snapshot_date: *global
  data2:
    args:
      urlpath: '{{CATALOG_DIR}}/data/{{snapshot_date}}/data2.csv'
    description: ''
    driver: intake.source.csv.CSVSource
    metadata: {}
    parameters:
      snapshot_date: *global

Now intake will accept keyword argument for snapshot_date for specific sources.

Some relevant answers: 1 and 2.

于 2021-11-10T13:10:56.423 回答