Skip to content

Check types

Every kind of check DataQ can author, generated from the check editor's catalog and the backend's vetted allowlist — so this page cannot drift from what the product actually offers. Every GX type on this page is executed in CI on a dataframe batch, and on a SQL batch too unless its row says it is dataframe-only.

Count
Check types in the editor 48
GX expectation types vetted by the backend 25

How to read a row: Parameters are the editor's fields (mostly is GX's optional row tolerance, a fraction). Thresholds are the severity bands read from the result. Dimension is the default data-quality dimension the check is classified under; you can change it on any check.

Each section ends with examples: the body you would send to create the check (POST /api/v1/suites/{suite_id}/checks; the same fields work over MCP and in a suite import) and, for every type that runs on a plain table, the result DataQ reports on the sample below. Those results are produced by DataQ's own check engine and re-checked in CI.

The sample table every example below runs on

Ten orders, with one deliberate defect in most columns.

order_id customer_email status amount discount subtotal tax total country sku ordered_at shipped_at payload legacy_code invoice_total
1 ana@example.com shipped 120.0 10.0 90.0 10.0 100.0 US SKU-0001 2026-09-20 09:15:00 2026-09-21 10:00:00 {"gift": false} NULL 100.0
2 bo@example.com pending 75.5 0.0 80.0 20.0 100.0 GB SKU-0002 2026-09-21 14:02:00 2026-09-22 08:30:00 {"gift": true} NULL 100.0
3 chen@example.com shipped 310.0 25.0 70.0 30.0 100.0 IN SKU-0003 2026-09-22 18:45:00 2026-09-23 12:00:00 {} NULL 100.0
4 NULL cancelled 42.0 0.0 95.0 5.0 100.0 DE SKU-0004 2026-09-23 07:30:00 2026-09-24 09:00:00 {"gift": false} NULL 105.0
5 dev@example.com refunded 18.25 2.0 60.0 40.0 100.0 US SKU-0005 2026-09-24 11:11:00 2026-09-25 16:20:00 {"gift": false} NULL 100.0
6 eli@example.com shipped -5.0 0.0 85.0 15.0 100.0 USA SKU-0006 2026-09-25 22:05:00 2026-09-26 07:45:00 {"gift": true} NULL 100.0
7 not-an-email pending 99.99 150.0 50.0 50.0 100.0 FR SKU-0007 2026-09-26 13:40:00 2026-09-27 10:10:00 {"gift": false} NULL 100.0
8 fay@example.com NULL 250.0 20.0 99.0 1.0 100.0 GB sku_8 2026-09-27 08:00:00 2026-09-27 06:00:00 {bad json NULL 100.0
9 gus@example.com shipped 60.0 5.0 75.0 25.0 100.0 IN SKU-0009 2026-09-27 19:25:00 2026-09-28 09:30:00 {"gift": false} NULL 100.0
7 hal@example.com shipped 88.0 8.0 40.0 50.0 90.0 US SKU-0010 2026/09/28 06:00 2026-09-28 18:00:00 {"gift": true} NULL 90.0

Column values

Great Expectations built-ins that look at the values in one or more columns. Each returns an unexpected-% that the warn / fail / critical severity bands read.

Check Type What it checks Dimension Parameters Thresholds Runs on
Column values not null expect_column_values_to_not_be_null Every value in the column is non-null. Completeness column, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column values unique expect_column_values_to_be_unique Values in the column are distinct (no duplicates). Uniqueness column, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column values in range expect_column_values_to_be_between Numeric values fall within [min, max]. Validity column, min_value (optional), max_value (optional), mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column values in set expect_column_values_to_be_in_set Every value is one of an allowed set. Validity column, value_set, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column values null expect_column_values_to_be_null Every value in the column is null — for a deprecated or not-yet-populated column that should stay empty. The inverse of “Column values not null”. Validity column, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column values not in set expect_column_values_to_not_be_in_set No value is one of a forbidden set — e.g. a status that should never reach this table, or placeholder values like “N/A” and “UNKNOWN”. Validity column, value_set, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column value lengths in range expect_column_value_lengths_to_be_between String lengths fall within [min, max]. Validity column, min_value (optional), max_value (optional), mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column value lengths equal expect_column_value_lengths_to_equal Every value is exactly the given number of characters — for a fixed-width code (ISO country, SKU, account number). Validity column, value, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column values match regex expect_column_values_to_match_regex Every value matches the given regular expression. Validity column, regex, mostly (optional) warn / fail / critical Snowflake, ADLS Gen2, AWS S3, Unity Catalog, Apache Iceberg, PostgreSQL, MySQL / MariaDB, Trino, Amazon Athena, Amazon Redshift — not SQL Server (no translation for that SQL dialect; refused at author time) · SQL pushdown on Unity Catalog
Column values do not match regex expect_column_values_to_not_match_regex No value matches the given regular expression — for catching a pattern that should never appear (a stray delimiter, an unredacted identifier). Validity column, regex, mostly (optional) warn / fail / critical Snowflake, ADLS Gen2, AWS S3, Unity Catalog, Apache Iceberg, PostgreSQL, MySQL / MariaDB, Trino, Amazon Athena, Amazon Redshift — not SQL Server (no translation for that SQL dialect; refused at author time) · SQL pushdown on Unity Catalog
Column values match a list of regexes expect_column_values_to_match_regex_list Every value matches the regexes in the list — by default ANY one of them is enough, for a column carrying several legitimate formats (e.g. two phone-number conventions). Validity column, regex_list, match_on (optional), mostly (optional) warn / fail / critical Snowflake, ADLS Gen2, AWS S3, Unity Catalog, Apache Iceberg, PostgreSQL, MySQL / MariaDB, Trino, Amazon Athena, Amazon Redshift — not SQL Server (no translation for that SQL dialect; refused at author time) · SQL pushdown on Unity Catalog
Column values match none of a list of regexes expect_column_values_to_not_match_regex_list No value matches ANY regex in the list — a deny-list of forbidden formats. Validity column, regex_list, mostly (optional) warn / fail / critical Snowflake, ADLS Gen2, AWS S3, Unity Catalog, Apache Iceberg, PostgreSQL, MySQL / MariaDB, Trino, Amazon Athena, Amazon Redshift — not SQL Server (no translation for that SQL dialect; refused at author time) · SQL pushdown on Unity Catalog
Column values are valid JSON expect_column_values_to_be_json_parseable Every value parses as JSON — for a payload/metadata column stored as text. Not offered on Snowflake, PostgreSQL, MySQL, Trino or SQL Server: Great Expectations implements this one only for dataframe batches, so a SQL batch would error on every run. Use a custom-SQL check there (or, on Snowflake, a VARIANT column). Validity column, mostly (optional) warn / fail / critical ADLS Gen2, AWS S3, Unity Catalog, Apache Iceberg — not Snowflake, PostgreSQL, MySQL / MariaDB, Trino, SQL Server, Amazon Athena, Amazon Redshift (no SQL implementation; refused at author time)
Column values are of type expect_column_values_to_be_of_type Every value in the column matches the given data type. Validity column, type_, mostly (optional) warn / fail / critical All datasources
Column values are of one of several types expect_column_values_to_be_in_type_list Every value in the column matches at least one of the given data types — the tolerant sibling of “Column values are of type”, for a column whose type legitimately varies by datasource or load. Validity column, type_list, mostly (optional) warn / fail / critical All datasources
Compound columns unique expect_compound_columns_to_be_unique The COMBINATION of values across the listed columns is distinct on every row — a multi-column primary or business key. Each column on its own may repeat freely. Uniqueness column_list, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column A greater than column B expect_column_pair_values_a_to_be_greater_than_b Row by row, column A is greater than column B — e.g. ended_at > started_at, or total >= discount. Validity column_A, column_B, or_equal (optional), mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column A equals column B expect_column_pair_values_to_be_equal Row by row, the two columns hold the same value — e.g. a denormalised copy that must agree with its source, or a total that must match a recomputed one. Validity column_A, column_B, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Values unique within each row expect_select_column_values_to_be_unique_within_record Within a single row, the listed columns all hold different values — e.g. a transfer whose source and destination account must not be the same. This is per-row; use “Compound columns unique” for uniqueness ACROSS rows. Uniqueness column_list, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Columns sum to a total expect_multicolumn_sum_to_equal Row by row, the listed columns add up to the given total — e.g. subtotal + tax + shipping = total. Validity column_list, sum_total, mostly (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog
Column distinct values in set expect_column_distinct_values_to_be_in_set Every DISTINCT value present in the column is one of an allowed set — reports WHICH unexpected values exist rather than how many rows carry them. Use “Column values in set” when you care about the row count. Validity column, value_set None — pass/fail only All datasources · SQL pushdown on Unity Catalog
Column distinct values contain set expect_column_distinct_values_to_contain_set Every value in the given set appears at least once in the column — catches a category that stopped arriving. The column may also contain other values. Completeness column, value_set None — pass/fail only All datasources · SQL pushdown on Unity Catalog
Column values match a date format expect_column_values_to_match_strftime_format Every value parses under the given strftime format — for a date or timestamp stored as text. Not offered on Snowflake, PostgreSQL, MySQL, Trino or SQL Server: Great Expectations implements this one only for dataframe batches, so a SQL batch would error on every run. Use a custom-SQL check there. Validity column, strftime_format, mostly (optional) warn / fail / critical ADLS Gen2, AWS S3, Unity Catalog, Apache Iceberg — not Snowflake, PostgreSQL, MySQL / MariaDB, Trino, SQL Server, Amazon Athena, Amazon Redshift (no SQL implementation; refused at author time)

Examples

Column values not null
{
  "name": "Column values not null",
  "expectation_type": "expect_column_values_to_not_be_null",
  "config": {
    "column": "customer_email"
  },
  "warn_threshold": 0,
  "fail_threshold": 5
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values [null]

Order 4 has no email: 1 of 10 rows (10%).

Column values unique
{
  "name": "Column values unique",
  "expectation_type": "expect_column_values_to_be_unique",
  "config": {
    "column": "order_id"
  }
}

On the sample: FAIL · 20% unexpected (2 rows) · unexpected values [7, 7]

Order id 7 appears twice, so both rows are unexpected.

Column values in range
{
  "name": "Column values in range",
  "expectation_type": "expect_column_values_to_be_between",
  "config": {
    "column": "amount",
    "min_value": 0,
    "max_value": 1000
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values [-5.0]

Order 6 has a negative amount.

Column values in set
{
  "name": "Column values in set",
  "expectation_type": "expect_column_values_to_be_in_set",
  "config": {
    "column": "status",
    "value_set": [
      "pending",
      "shipped",
      "cancelled"
    ]
  }
}

On the sample: FAIL · 11.11% unexpected (1 row) · unexpected values ["refunded"]

refunded is not in the allowed set: 1 of the 9 non-NULL values (GX skips a NULL).

Column values null
{
  "name": "Column values null",
  "expectation_type": "expect_column_values_to_be_null",
  "config": {
    "column": "legacy_code"
  }
}

On the sample: PASS · 0% unexpected (0 rows)

A retired column that must stay empty: every row is NULL.

Column values not in set
{
  "name": "Column values not in set",
  "expectation_type": "expect_column_values_to_not_be_in_set",
  "config": {
    "column": "status",
    "value_set": [
      "refunded",
      "unknown"
    ]
  }
}

On the sample: FAIL · 11.11% unexpected (1 row) · unexpected values ["refunded"]

One order is refunded, a status that should never reach this table.

Column value lengths in range
{
  "name": "Column value lengths in range",
  "expectation_type": "expect_column_value_lengths_to_be_between",
  "config": {
    "column": "sku",
    "min_value": 8,
    "max_value": 8
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values ["sku_8"]

sku_8 is five characters.

Column value lengths equal
{
  "name": "Column value lengths equal",
  "expectation_type": "expect_column_value_lengths_to_equal",
  "config": {
    "column": "country",
    "value": 2
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values ["USA"]

USA is not an ISO 3166 alpha-2 code.

Column values match regex
{
  "name": "Column values match regex",
  "expectation_type": "expect_column_values_to_match_regex",
  "config": {
    "column": "sku",
    "regex": "^SKU-\\d{4}$"
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values ["sku_8"]

sku_8 doesn't match the SKU pattern.

Column values do not match regex
{
  "name": "Column values do not match regex",
  "expectation_type": "expect_column_values_to_not_match_regex",
  "config": {
    "column": "customer_email",
    "regex": "^[^@]+$"
  }
}

On the sample: FAIL · 11.11% unexpected (1 row) · unexpected values ["not-an-email"]

A value with no @ is not an email: not-an-email.

Column values match a list of regexes
{
  "name": "Column values match a list of regexes",
  "expectation_type": "expect_column_values_to_match_regex_list",
  "config": {
    "column": "sku",
    "regex_list": [
      "^SKU-\\d{4}$",
      "^LEGACY-\\d+$"
    ],
    "match_on": "any"
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values ["sku_8"]

Two accepted formats; sku_8 matches neither.

Column values match none of a list of regexes
{
  "name": "Column values match none of a list of regexes",
  "expectation_type": "expect_column_values_to_not_match_regex_list",
  "config": {
    "column": "customer_email",
    "regex_list": [
      "@test\\.",
      "^not-"
    ]
  }
}

On the sample: FAIL · 11.11% unexpected (1 row) · unexpected values ["not-an-email"]

A deny-list of placeholder addresses; not-an-email is caught.

Column values are valid JSON
{
  "name": "Column values are valid JSON",
  "expectation_type": "expect_column_values_to_be_json_parseable",
  "config": {
    "column": "payload"
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values ["{bad json"]

Order 8's payload is truncated JSON.

Column values are of type
{
  "name": "Column values are of type",
  "expectation_type": "expect_column_values_to_be_of_type",
  "config": {
    "column": "amount",
    "type_": "float64"
  }
}

On the sample: PASS · observed "float64"

The sample is a pandas frame, so the dtype name is float64 (see the dtype table in the datasources guide).

Column values are of one of several types
{
  "name": "Column values are of one of several types",
  "expectation_type": "expect_column_values_to_be_in_type_list",
  "config": {
    "column": "order_id",
    "type_list": [
      "int64",
      "int32"
    ]
  }
}

On the sample: PASS · observed "int64"

Either integer width is accepted.

Compound columns unique
{
  "name": "Compound columns unique",
  "expectation_type": "expect_compound_columns_to_be_unique",
  "config": {
    "column_list": [
      "order_id",
      "customer_email"
    ]
  }
}

On the sample: PASS · 0% unexpected (0 rows)

The duplicated order id carries two different emails, so the pair is still unique.

Column A greater than column B
{
  "name": "Column A greater than column B",
  "expectation_type": "expect_column_pair_values_a_to_be_greater_than_b",
  "config": {
    "column_A": "shipped_at",
    "column_B": "ordered_at",
    "or_equal": true
  }
}

On the sample: FAIL · 20% unexpected (2 rows) · unexpected values [["2026-09-27 06:00:00", "2026-09-27 08:00:00"], ["2026-09-28 18:00:00", "2026/09/28 06:00"]]

Order 8 shipped before it was ordered. These are text columns, so the last row, whose date is written 2026/09/28 06:00, also compares out of order: parse dates upstream.

Column A equals column B
{
  "name": "Column A equals column B",
  "expectation_type": "expect_column_pair_values_to_be_equal",
  "config": {
    "column_A": "total",
    "column_B": "invoice_total"
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values [[100.0, 105.0]]

Order 4 was invoiced 5 more than its total, so 1 row of 10 fails.

Values unique within each row
{
  "name": "Values unique within each row",
  "expectation_type": "expect_select_column_values_to_be_unique_within_record",
  "config": {
    "column_list": [
      "subtotal",
      "tax"
    ]
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values [{"subtotal": 50.0, "tax": 50.0}]

Order 7 has subtotal and tax both 50.

Columns sum to a total
{
  "name": "Columns sum to a total",
  "expectation_type": "expect_multicolumn_sum_to_equal",
  "config": {
    "column_list": [
      "subtotal",
      "tax"
    ],
    "sum_total": 100
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values [{"subtotal": 40.0, "tax": 50.0}]

The last row's parts sum to 90.

Column distinct values in set
{
  "name": "Column distinct values in set",
  "expectation_type": "expect_column_distinct_values_to_be_in_set",
  "config": {
    "column": "country",
    "value_set": [
      "US",
      "GB",
      "IN",
      "DE",
      "FR"
    ]
  }
}

On the sample: FAIL · unexpected values ["USA"]

USA is outside the set. There is no unexpected-%: the check passes or fails on the set of distinct values, and the failing sample lists the ones outside it.

Column distinct values contain set
{
  "name": "Column distinct values contain set",
  "expectation_type": "expect_column_distinct_values_to_contain_set",
  "config": {
    "column": "country",
    "value_set": [
      "US",
      "GB",
      "JP"
    ]
  }
}

On the sample: FAIL

No order comes from Japan.

Column values match a date format
{
  "name": "Column values match a date format",
  "expectation_type": "expect_column_values_to_match_strftime_format",
  "config": {
    "column": "ordered_at",
    "strftime_format": "%Y-%m-%d %H:%M:%S"
  }
}

On the sample: FAIL · 10% unexpected (1 row) · unexpected values ["2026/09/28 06:00"]

The last row was written as 2026/09/28 06:00.

Table shape

Whole-table expectations.

Check Type What it checks Dimension Parameters Thresholds Runs on
Table row count in range expect_table_row_count_to_be_between The table’s row count falls within [min, max]. Completeness min_value (optional), max_value (optional) warn / fail / critical All datasources · SQL pushdown on Unity Catalog

Examples

Table row count in range
{
  "name": "Table row count in range",
  "expectation_type": "expect_table_row_count_to_be_between",
  "config": {
    "min_value": 5,
    "max_value": 1000
  }
}

On the sample: PASS · observed 10

Ten rows is inside the band.

Freshness

How stale is the target? Measured from a timestamp column (or file arrival time on flat files), reported in hours, banded by age. Requires a fail or critical threshold.

Check Type What it checks Dimension Parameters Thresholds Runs on
Freshness monitor:freshness How stale is the target? Measures hours since the latest timestamp in the data — or, on a flat file with no column set, since the file last landed. Timeliness column warn / fail / critical (fail or critical required) All datasources

Examples

Freshness
{
  "name": "Freshness",
  "expectation_type": "monitor:freshness",
  "kind": "freshness",
  "config": {
    "column": "shipped_at"
  },
  "warn_threshold": 24,
  "fail_threshold": 48
}

Reports the newest shipped_at and its age in hours as the metric; with these thresholds, 24 h old or more warns and 48 h fails. Leave column out on a flat file to measure the file's arrival time instead.

Volume

Did the load deliver the expected row count? Banded by count. Requires a fail or critical threshold.

Check Type What it checks Dimension Parameters Thresholds Runs on
Volume monitor:volume Did the load deliver the expected row count? Flags a count outside an allowed range. Completeness min_rows, max_rows warn / fail / critical All datasources

Examples

Volume
{
  "name": "Volume",
  "expectation_type": "monitor:volume",
  "kind": "volume",
  "config": {
    "min_rows": 5,
    "max_rows": 1000
  }
}

Reports the row count as the metric; outside the band fails. On the sample, 10 rows passes.

Aggregate

Does a column statistic — mean, median, sum, standard deviation, min or max — stay inside two-sided bands? The value is recorded every run, so it trends; an empty table or all-NULL column reports error, never a made-up 0.

Check Type What it checks Dimension Parameters Thresholds Runs on
Aggregate statistic monitor:aggregate A column statistic — mean, median, sum, standard deviation, min or max — stays inside two-sided bands. The value itself is recorded every run, so it trends. An empty table or an all-NULL column reports error, never a made-up 0. — (set it yourself) aggregate, column, min_value (optional), max_value (optional), warn_min (optional), warn_max (optional), critical_min (optional), critical_max (optional) Two-sided warn / fail / critical bounds, set as parameters All datasources — median not on MySQL / MariaDB, Trino, Amazon Athena (no exact median; refused at author time)

Examples

Aggregate statistic
{
  "name": "Aggregate statistic",
  "expectation_type": "monitor:aggregate",
  "kind": "aggregate",
  "config": {
    "aggregate": "mean",
    "column": "amount",
    "min_value": 50,
    "warn_max": 100
  }
}

Reports the mean of amount as the metric and records it every run, so it trends. On the sample the mean is 105.87: above warn_max, inside the fail band, so WARN.

Schema

Did the table's columns change against a captured baseline?

Check Type What it checks Dimension Parameters Thresholds Runs on
Schema drift monitor:schema_drift Did the table’s column shape change? Diffs the live columns (names + types) against a baseline captured on the first run. Works on every datasource — warehouses via information_schema, flat files via the file header/footer, Iceberg from table metadata. Consistency ignore_columns (optional) warn / fail / critical All datasources

Examples

Schema drift
{
  "name": "Schema drift",
  "expectation_type": "monitor:schema_drift",
  "kind": "schema_drift",
  "config": {
    "ignore_columns": [
      "legacy_code"
    ]
  }
}

The first run captures the columns and their types as the baseline; later runs report every added, dropped or retyped column. legacy_code is never compared.

Anomaly

Is today's value unusual against a rolling baseline of this check's own history? Skips until enough history exists.

Check Type What it checks Dimension Parameters Thresholds Runs on
Anomaly monitor:anomaly Learns a rolling baseline (mean/stddev) from this check’s own metric history and flags how far this run deviates (a z-score). Reports skip, never a fake pass/fail, until enough history accrues. — (set it yourself) target_metric, column, window (optional), min_points (optional), seasonality (optional) warn / fail / critical (fail or critical required) Snowflake, Unity Catalog, PostgreSQL, MySQL / MariaDB, Trino, SQL Server, Amazon Athena, Amazon Redshift

Examples

Anomaly
{
  "name": "Anomaly",
  "expectation_type": "monitor:anomaly",
  "kind": "anomaly",
  "config": {
    "target_metric": "row_count",
    "window": 14,
    "min_points": 7,
    "seasonality": true
  },
  "warn_threshold": 2,
  "fail_threshold": 3
}

Reports the z-score of today's row count against the last 14 runs on the same weekday (seasonality keeps only those; off, it is the last 14 runs of any day). It skips until 7 such runs exist, so on a daily schedule about seven weeks.

Comparison

Reconcile the suite's target against a second dataset, possibly on another connection.

Check Type What it checks Dimension Parameters Thresholds Runs on
Records reconciliation comparison:records Diff this suite’s dataset (the target under test) against a baseline on another connection, joined on key columns — matched / mismatched / additional-per-side ROW buckets. Consistency — warn / fail / critical All datasources
Column-level reconciliation comparison:columns Same key-joined diff, counted per VALUE: each column reports its own matched / mismatched / additional-per-side counts. Pick this when you need to know WHICH columns drift, not just which rows. Consistency — warn / fail / critical All datasources

Examples

Records reconciliation
{
  "name": "Records reconciliation",
  "expectation_type": "comparison:records",
  "kind": "comparison",
  "config": {
    "source": {
      "table": "orders_staging",
      "schema": "public"
    },
    "keys": [
      "order_id"
    ]
  },
  "source_connection_id": "<connection id>"
}

Joins the suite's target to orders_staging on order_id and reports matched, mismatched and missing rows on each side; set source_connection_id to the connection holding the source.

Column-level reconciliation
{
  "name": "Column-level reconciliation",
  "expectation_type": "comparison:columns",
  "kind": "comparison",
  "config": {
    "source": {
      "table": "orders_staging",
      "schema": "public"
    },
    "keys": [
      "order_id"
    ],
    "columns": [
      "amount",
      "status"
    ]
  },
  "source_connection_id": "<connection id>"
}

Like the record comparison, but compares only the listed columns and reports the mismatch rate for each.

Custom SQL

Any predicate you can write in SQL, validated before it runs.

Check Type What it checks Dimension Parameters Thresholds Runs on
Custom SQL unexpected_rows_expectation A SQL query that should return no rows — any rows it returns are failures. — (set it yourself) unexpected_rows_query warn / fail / critical Snowflake, Unity Catalog, PostgreSQL, MySQL / MariaDB, Trino, SQL Server, Amazon Athena, Amazon Redshift

Examples

Custom SQL
{
  "name": "Custom SQL",
  "expectation_type": "unexpected_rows_expectation",
  "config": {
    "unexpected_rows_query": "SELECT * FROM {batch} WHERE discount > amount"
  }
}

Every row the query returns is unexpected. On the sample, order 7's discount (150) exceeds its amount, so 1 row fails. {batch} is the suite's target.

Snowflake DMF

Snowflake's native Data Metric Functions, evaluated inside Snowflake.

Check Type What it checks Dimension Parameters Thresholds Runs on
Null count (DMF) dmf:null_count Snowflake’s system NULL_COUNT metric function, computed natively in the warehouse. Completeness column warn / fail / critical (fail or critical required) Snowflake
Null percent (DMF) dmf:null_percent Snowflake’s system NULL_PERCENT metric function (0–100), computed natively in the warehouse. Completeness column warn / fail / critical (fail or critical required) Snowflake
Duplicate count (DMF) dmf:duplicate_count Snowflake’s system DUPLICATE_COUNT metric function, computed natively in the warehouse. Uniqueness column warn / fail / critical (fail or critical required) Snowflake
Blank count (DMF) dmf:blank_count Snowflake’s system BLANK_COUNT metric function, computed natively in the warehouse — counts empty or space-only strings (not NULLs; tabs/newlines aren’t treated as blank). VARCHAR columns only. Completeness column warn / fail / critical (fail or critical required) Snowflake
Future timestamp percent (DMF) dmf:future_timestamp_percent Snowflake’s system FUTURE_TIMESTAMP_PERCENT metric function (0–100): the share of rows dated after the evaluation time. DATE, TIMESTAMP_LTZ and TIMESTAMP_TZ columns only. Validity column warn / fail / critical (fail or critical required) Snowflake
Accepted values (DMF) dmf:accepted_values Snowflake’s system ACCEPTED_VALUES metric function, evaluated in the warehouse: counts rows whose value is not in the list. NULLs are not counted as violations. Validity column, value_set warn / fail / critical (fail or critical required) Snowflake
Unique count (DMF) dmf:unique_count Snowflake’s system UNIQUE_COUNT metric function, computed natively in the warehouse. Degrades downward, so this type carries no thresholds — read the observed value directly. Uniqueness column None — pass/fail only Snowflake
Custom DMF dmf:custom A data metric function your team created in Snowflake (CREATE DATA METRIC FUNCTION), called in the warehouse over columns of this suite’s table. Its return value is the metric, shown as-is — write DMFs that return a count or a percentage, not a data value. — (set it yourself) function, columns warn / fail / critical (fail or critical required) Snowflake

Examples

Null count (DMF)
{
  "name": "Null count (DMF)",
  "expectation_type": "dmf:null_count",
  "engine": "dmf",
  "config": {
    "column": "CUSTOMER_EMAIL"
  },
  "fail_threshold": 1
}

Snowflake counts the NULLs itself (SNOWFLAKE.CORE.NULL_COUNT); the count is the metric. On the sample it would be 1.

Null percent (DMF)
{
  "name": "Null percent (DMF)",
  "expectation_type": "dmf:null_percent",
  "engine": "dmf",
  "config": {
    "column": "CUSTOMER_EMAIL"
  },
  "warn_threshold": 1,
  "fail_threshold": 5
}

The NULL percentage (10 on the sample).

Duplicate count (DMF)
{
  "name": "Duplicate count (DMF)",
  "expectation_type": "dmf:duplicate_count",
  "engine": "dmf",
  "config": {
    "column": "ORDER_ID"
  },
  "fail_threshold": 1
}

Rows whose value repeats another row's (2 on the sample: both order 7s).

Blank count (DMF)
{
  "name": "Blank count (DMF)",
  "expectation_type": "dmf:blank_count",
  "engine": "dmf",
  "config": {
    "column": "STATUS"
  },
  "fail_threshold": 1
}

Empty or whitespace-only strings; a NULL is not blank.

Future timestamp percent (DMF)
{
  "name": "Future timestamp percent (DMF)",
  "expectation_type": "dmf:future_timestamp_percent",
  "engine": "dmf",
  "config": {
    "column": "SHIPPED_AT"
  },
  "fail_threshold": 0.01
}

The percentage of timestamps later than now; takes DATE, TIMESTAMP_LTZ and TIMESTAMP_TZ columns only.

Accepted values (DMF)
{
  "name": "Accepted values (DMF)",
  "expectation_type": "dmf:accepted_values",
  "engine": "dmf",
  "config": {
    "column": "STATUS",
    "value_set": [
      "pending",
      "shipped",
      "cancelled"
    ]
  },
  "fail_threshold": 1
}

Values outside the set.

Unique count (DMF)
{
  "name": "Unique count (DMF)",
  "expectation_type": "dmf:unique_count",
  "engine": "dmf",
  "config": {
    "column": "ORDER_ID"
  }
}

The number of distinct non-NULL values (9 on the sample).

Custom DMF
{
  "name": "Custom DMF",
  "expectation_type": "dmf:custom",
  "engine": "dmf",
  "config": {
    "function": "ANALYTICS.DQ.NEGATIVE_AMOUNTS",
    "columns": [
      "AMOUNT"
    ]
  },
  "fail_threshold": 1
}

Calls your own data metric function over the listed columns; whatever it returns is the metric, banded by the thresholds.

Databricks DQX

Databricks Labs DQX row rules, evaluated by a serverless job in your own workspace.

Check Type What it checks Dimension Parameters Thresholds Runs on
Not null (DQX) dqx:is_not_null Rows where the column is NULL. Completeness column, mode (optional) warn / fail / critical All datasources
Not empty (DQX) dqx:is_not_empty Rows where the column is an empty string. Completeness column, mode (optional) warn / fail / critical All datasources
Not null or empty (DQX) dqx:is_not_null_and_not_empty Rows where the column is NULL or an empty string. Completeness column, mode (optional) warn / fail / critical All datasources
In list (DQX) dqx:is_in_list Rows whose value is not one of the allowed values. Validity column, allowed, mode (optional) warn / fail / critical All datasources
In range (DQX) dqx:is_in_range Rows whose value falls outside the inclusive range. Validity column, min_limit, max_limit, mode (optional) warn / fail / critical All datasources
Matches regex (DQX) dqx:regex_match Rows whose value does not match the regular expression. Validity column, regex, mode (optional) warn / fail / critical All datasources
Not less than (DQX) dqx:is_not_less_than Rows whose value is below the limit. Validity column, limit, mode (optional) warn / fail / critical All datasources
Not greater than (DQX) dqx:is_not_greater_than Rows whose value is above the limit. Validity column, limit, mode (optional) warn / fail / critical All datasources

Examples

Not null (DQX)
{
  "name": "Not null (DQX)",
  "expectation_type": "dqx:is_not_null",
  "engine": "dqx",
  "config": {
    "column": "customer_email"
  },
  "fail_threshold": 1
}

Databricks DQX counts failing rows in your workspace; the failing count is the metric (1 on the sample).

Not empty (DQX)
{
  "name": "Not empty (DQX)",
  "expectation_type": "dqx:is_not_empty",
  "engine": "dqx",
  "config": {
    "column": "status"
  },
  "fail_threshold": 1
}

Rows whose value is an empty string.

Not null or empty (DQX)
{
  "name": "Not null or empty (DQX)",
  "expectation_type": "dqx:is_not_null_and_not_empty",
  "engine": "dqx",
  "config": {
    "column": "status",
    "mode": "stream"
  },
  "fail_threshold": 1
}

NULL or empty. mode: stream evaluates only rows appended since the last run.

In list (DQX)
{
  "name": "In list (DQX)",
  "expectation_type": "dqx:is_in_list",
  "engine": "dqx",
  "config": {
    "column": "status",
    "allowed": [
      "pending",
      "shipped",
      "cancelled"
    ]
  },
  "fail_threshold": 1
}

Rows outside the list (refunded on the sample).

In range (DQX)
{
  "name": "In range (DQX)",
  "expectation_type": "dqx:is_in_range",
  "engine": "dqx",
  "config": {
    "column": "amount",
    "min_limit": 0,
    "max_limit": 1000
  },
  "fail_threshold": 1
}

Rows outside [0, 1000] (order 6).

Matches regex (DQX)
{
  "name": "Matches regex (DQX)",
  "expectation_type": "dqx:regex_match",
  "engine": "dqx",
  "config": {
    "column": "sku",
    "regex": "^SKU-[0-9]{4}$"
  },
  "fail_threshold": 1
}

Rows not matching (sku_8).

Not less than (DQX)
{
  "name": "Not less than (DQX)",
  "expectation_type": "dqx:is_not_less_than",
  "engine": "dqx",
  "config": {
    "column": "amount",
    "limit": 0
  },
  "fail_threshold": 1
}

Rows below the limit.

Not greater than (DQX)
{
  "name": "Not greater than (DQX)",
  "expectation_type": "dqx:is_not_greater_than",
  "engine": "dqx",
  "config": {
    "column": "discount",
    "limit": 100
  },
  "fail_threshold": 1
}

Rows above the limit (order 7's discount of 150).

Authorable outside the editor

Vetted by the backend but with no editor widget: usable over the REST API, MCP and suite import, which hand the backend raw JSON.

  • expect_column_pair_values_to_be_in_set

Not offered, and why

GX's scalar aggregates (expect_column_mean_to_be_between and its siblings) report one number and no unexpected-%, so severity bands have nothing to band — the Aggregate monitor measures that shape instead, with two-sided bands and a trend. Whole-table column-set comparisons are what the Schema-drift monitor does against a captured baseline. For anything else, write a custom-SQL check.


Generated by scripts/docs/gen-check-catalog.py — edit the catalog or the allowlist, not this page.