Metadata Workflows
This feature requires the
quilt3
API version 3.3 or higher.
Overview
A Quilt workflow is a quality gate that you set to ensure the quality of your data and metadata before it becomes a Quilt package. You can create as many workflows as you like to accommodate all of your data creation patterns.
By default, workflows are required.
On data quality
Under the hood, Quilt workflows use JSON Schema to check that package metadata have the right shape. Metadata shape determines which keys are defined, their values, and the types of the values.
Ensuring the quality of your data has long-lasting implications:
Consistency — if labels and other metadata don't use a consistent, controlled vocabulary, reuse becomes difficult and trust in data declines
Completeness — if your workflows do not require users to include files, documentation, labels, etc. then your data is on its way towards becoming mystery data and ultimately junk data that no one can use
Context — data can only be reused if users know where it came from, what it means, who touched it, and what the related datasets are
From the standpoint of querying engines like Amazon Athena, data that lacks consistency and completeness is extremely difficult to query longitudinally and depreciates over time (as team members change, platforms change, and tribal knowledge is lost).
Use cases
Ensure that labels are correct and drawn from a controlled vocabulary (e.g. ensure that the only labels in a package of images are either "bird" or "not bird"; avoid data entry errors like "birb")
Ensure that users provide a
README.md
for every new packageEnsure that included files are non-empty
Ensure that every new package (or dataset) has enough labels so that it can be reused (e.g. Date, Creator, Type, etc.)
Get started
To get started, create a configuration file in your Quilt S3 bucket at s3://BUCKET-NAME/.quilt/workflows/config.yml
.
Here's an example:
With the above configuration, you must specify a workflow before you can push:
Let's try with the workflow=
parameter:
The above QuiltException
is caused by is_message_required: true
. Here's how we can pass the workflow:
Now let's push with workflow='beta'
:
We encountered another exception because the beta
workflow specifies metadata_schema: superheroes
. Therefore, the test/package
metadata must validate against the JSON Schema at s3://quilt-dev-metadata/schemas/superheroes.schema.json
:
Note that superhero
is a required property:
For the gamma
workflow, both is_message_required: true
and metadata_schema
are set, so both message
and package metadata are validated:
Bypassing workflow validation and setting a default workflow
As stated above, by default workflows are required. If you wish for your users to be able to skip workflow validation altogether, you can make workflow validation optional with is_workflow_required: False
at the top-level in your config.yml
file:
Now your users can specify workflow=None
in the Python API (or --workflow ''
in the CLI) when they push packages.
In addition, a default_workflow
value can also be set at the top-level in your config.yml
file:
This specifies which workflow will be used (experiment
) if a workflow
parameter in the Package.push()
API call or CLI is not provided.
JSON Schema
Quilt workflows support the Draft 7 JSON Schema.
JSON schemas can be stored anywhere in your Amazon S3 bucket. Provided the path to the file is accessible in
config.yml
, the schema will successfully validate your package metadata shape.
Default values
Quilt supports the default
keyword.
Auto-fill dates
If you wish to pre-populate dates in the Quilt catalog, you can use the custom keyword dateformat
in your schemas. For example:
The dateformat
template follows Unicode Technical Standard #35.
Arrays, tuples and enums
Quilt supports the array
data type. You can use array
if you need to define a list of metadata values for a metadata key. These elements can be of any type.
If the order in the list is not significant, use "arrays" (using "items"
and "anyOf"
):
With this Schema you can create a list of metadata values such as: ["Any string A", 123, "Any string B"]
or [123, "Any string", 456]
If the order in the list is important and the list is fixed in length, then use "tuples" (using "items"
, "minItems"
, and "maxItems"
):
With this Schema you can create strictly ordered lists, such as ["Any string", 123]
.
An incorrect order will return an error [123, "Any string"] // invalid
.
Remember that you should define
"minItems"
and"maxItems"
or"minItems"
and"additionalItems": false
, because "tuples" must have a fixed size.
Instead of letting users set any metadata value, you can define list of available options with enum
:
With this Schema you can create a list of any length with predefined values, such as ["Fixed 1", "Fixed 2", "Fixed 1"]
.
With this Schema users are allowed to create tuples like ["Fixed 1"]
or ["Fixed 2"]
.
If you want to provide users with a list of predefined metadata values but additionally let them add any values outside of this list, you can use the anyOf
keyword:
Metadata lists such as ["Fixed 1", "Fixed 2"]
, ["Fixed 1", "Any string"]
or ["Any string 1", "Any string 2"]
are all valid.
In certain use cases you may want to define metadata lists that have first-ordered items of predefined values, and the rest are any other outside of the predefined values. Then you create tuples with "additionalItems": true
:
With this Schema lists such as ["Fixed 1", "Any string", 123]
are valid but ["Any string", 123]
are invalid.
Example properties
The following examples show how you can specify complex properties
such as object
, array
, and compound enum
types.
Objects
Compound enums: arrays
Compound enums: objects
Compound enums: arrays and objects
This allows for flexible and extensible schema definition, and hence validation, of complex metadata schemas to any depth.
Quilt currently uses the Draft 4 Json Schema where tuples are validated with
items
, and notprefixItems
. TheprefixItems
keyword was added in Draft 2020-12, and is not currently supported.
Data quality controls
In addition to package-level metadata. Quilt workflows enable you to validate package names, and basic file metadata.
You must include the following schema version at the root of your config.yml in order for any catalog-specific features to function:
Package name defaults (Quilt catalog)
By default the Quilt catalog auto-fills the package handle prefix according to the following logic:
Packages tab: username (everything before the @ in your sign-in email). Equivalent to
Files tab: parent directory name. Equivalent to
You can customize the default prefix with package_handle
key in one or both of the following places:
Set
catalog.package_handle.(files|packages)
at the root of config.yml to affect all workflowsSet
workflows.WORKFLOW.catalog.package_handle.(files|packages)
to affect the tabs and workflow in question
Example
Package name validation
You can validate package names with WORKFLOW.handle_pattern
, which accepts JavaScript regular expression.
By default, patterns are not anchored. You can explicitly add start (
^
) and end ($
) markers as needed.
Example
Package file validation
You can validate the names, sizes and metadata of files in the package with WORKFLOW.entries_schema
. The provided schema runs against an array of objects known as package entries. Each package entry defines a logical key (its relative path and name in the parent package), size (in bytes) and metadata.
Example
s3://bucket/must-contain-readme.json
Requires a README
s3://bucket/must-contain-readme-summarize-at-least-1byte.json
s3://bucket/must-have-foo-bar-meta.json
Requires { "foo": "bar" }
object as user specified metadata in README.md
Cross-bucket package push (Quilt catalog)
In Quilt, S3 buckets are like git branches but for data. With quilt3
you can browse
any package and then push
it to any bucket that you choose.
As a rule, cross-bucket pushes or "merges" reflect change in a package's lifecycle. For example, you might push a package from my-staging-bucket to my-production-bucket as it matures and becomes trusted.
The catalog's Push to bucket feature can be enabled by adding a successors
property to the config. A successor is a destination bucket.
If copy_data
is true
(the default), all package entries will be copied to the destination bucket. If copy_data
is false
, all entries will remain in their current locations.
config.yml
JSON Schema
config.yml
JSON SchemaSee workflows-config_catalog-1.0.0.json and workflows-config-1.1.0.json.
Known limitations
Only Draft 7 Json Schemas are supported
If a workflow schema includes a non-supported keyword, the user interface displays an
unknown keyword: <non-supported keyword>
error
Schemas with
$ref
are not supportedSchemas must be in an S3 bucket for which the Quilt user has read permissions
Last updated