Intake:目录级参数

Intake: catalogue level parameters

我正在阅读有关“参数”的内容here,想知道我是否可以定义目录级参数,以便稍后在目录源的定义中使用?

考虑一个具有两个来源的简单 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)都在 urlpath 参数中使用了 snapshot_date 参数?有了这个定义,我可以加载数据源:

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 参数?这样:

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

提前致谢

这个想法之前有人提出过(https://github.com/intake/intake/pull/562 , https://github.com/intake/intake/issues/511 ), and I have an inkling that maybe https://github.com/zillow/intake-nested-yaml-catalog 支持你问的东西。

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

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

这有点乱七八糟,但请考虑一个包含以下内容的 yaml 文件:

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

现在 intake 将接受 snapshot_date 特定来源的关键字参数。

部分相关回答:1 and 2.