mirror of
				https://github.com/datahub-project/datahub.git
				synced 2025-10-31 10:49:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			221 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Snowflake DMF Assertions [BETA]
 | |
| 
 | |
| The DataHub Open Assertion Compiler allows you to define your Data Quality assertions in a simple YAML format, and then compile them to be executed by Snowflake Data Metric Functions.
 | |
| Once compiled, you'll be able to register the compiled DMFs in your Snowflake environment, and extract their results them as part of your normal ingestion process for DataHub.
 | |
| Results of Snowflake DMF assertions will be reported as normal Assertion Results, viewable on a historical timeline in the context
 | |
| of the table with which they are associated.
 | |
| 
 | |
| ## Prerequisites
 | |
| 
 | |
| - You must have a Snowflake Enterprise account, where the DMFs feature is enabled.
 | |
| - You must have the necessary permissions to provision DMFs in your Snowflake environment (see below)
 | |
| - You must have the necessary permissions to query the DMF results in your Snowflake environment (see below)
 | |
| - You must have DataHub instance with Snowflake metadata ingested. If you do not have existing snowflake ingestion, refer [Snowflake Quickstart Guide](https://docs.datahub.com/docs/quick-ingestion-guides/snowflake/overview) to get started.
 | |
| - You must have DataHub CLI installed and run [`datahub init`](https://docs.datahub.com/docs/cli/#init).
 | |
| 
 | |
| ### Permissions
 | |
| 
 | |
| _Permissions required for registering DMFs_
 | |
| 
 | |
| According to the latest Snowflake docs, here are the permissions the service account performing the
 | |
| DMF registration and ingestion must have:
 | |
| 
 | |
| | Privilege                    | Object           | Notes                                                                                                                      |
 | |
| | ---------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------- |
 | |
| | USAGE                        | Database, schema | Database and schema where snowflake DMFs will be created. This is configured in compile command described below.           |
 | |
| | CREATE FUNCTION              | Schema           | This privilege enables creating new DMF in schema configured in compile command.                                           |
 | |
| | EXECUTE DATA METRIC FUNCTION | Account          | This privilege enables you to control which roles have access to server-agnostic compute resources to call the system DMF. |
 | |
| | USAGE                        | Database, schema | These objects are the database and schema that contain the referenced table in the query.                                  |
 | |
| | OWNERSHIP                    | Table            | This privilege enables you to associate a DMF with a referenced table.                                                     |
 | |
| | USAGE                        | DMF              | This privilege enables calling the DMF in schema configured in compile command.                                            |
 | |
| 
 | |
| and the roles that must be granted:
 | |
| 
 | |
| | Role                       | Notes              |
 | |
| | -------------------------- | ------------------ |
 | |
| | SNOWFLAKE.DATA_METRIC_USER | To use System DMFs |
 | |
| 
 | |
| _Permissions required for running DMFs (scheduled DMFs run with table owner's role)_
 | |
| 
 | |
| Because scheduled DMFs run with the role of the table owner, the table owner must have the following privileges:
 | |
| 
 | |
| | Privilege                    | Object           | Notes                                                                                                                      |
 | |
| | ---------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------- |
 | |
| | USAGE                        | Database, schema | Database and schema where snowflake DMFs will be created. This is configured in compile command described below.           |
 | |
| | USAGE                        | DMF              | This privilege enables calling the DMF in schema configured in compile power.                                              |
 | |
| | EXECUTE DATA METRIC FUNCTION | Account          | This privilege enables you to control which roles have access to server-agnostic compute resources to call the system DMF. |
 | |
| 
 | |
| and the roles that must be granted:
 | |
| 
 | |
| | Role                       | Notes              |
 | |
| | -------------------------- | ------------------ |
 | |
| | SNOWFLAKE.DATA_METRIC_USER | To use System DMFs |
 | |
| 
 | |
| _Permissions required for querying DMF results_
 | |
| 
 | |
| In addition, the service account that will be executing DataHub Ingestion, and querying the DMF results, must have been granted the following system application roles:
 | |
| 
 | |
| | Role                           | Notes                       |
 | |
| | ------------------------------ | --------------------------- |
 | |
| | DATA_QUALITY_MONITORING_VIEWER | Query the DMF results table |
 | |
| 
 | |
| To learn more about Snowflake DMFs and the privileges required to provision and query them, see the [Snowflake documentation](https://docs.snowflake.com/en/user-guide/data-quality-intro).
 | |
| 
 | |
| _Example: Granting Permissions_
 | |
| 
 | |
| ```sql
 | |
| -- setup permissions to <assertion-registration-role> to create DMFs and associate DMFs with table
 | |
| grant usage on database "<dmf-database>" to role "<assertion-service-role>"
 | |
| grant usage on schema "<dmf-database>.<dmf-schema>" to role "<assertion-service-role>"
 | |
| grant create function on schema "<dmf-database>.<dmf-schema>" to role "<assertion-service-role>"
 | |
| -- grant ownership + rest of permissions to <assertion-service-role>
 | |
| grant role "<table-owner-role>" to role "<assertion-service-role>"
 | |
| 
 | |
| -- setup permissions for <table-owner-role> to run DMFs on schedule
 | |
| grant usage on database "<dmf-database>" to role "<table-owner-role>"
 | |
| grant usage on schema "<dmf-database>.<dmf-schema>" to role "<table-owner-role>"
 | |
| grant usage on all functions in "<dmf-database>.<dmf-schema>" to role "<table-owner-role>"
 | |
| grant usage on future functions in "<dmf-database>.<dmf-schema>" to role "<table-owner-role>"
 | |
| grant database role SNOWFLAKE.DATA_METRIC_USER to role "<table-owner-role>"
 | |
| grant execute data metric function on account to role "<table-owner-role>"
 | |
| 
 | |
| -- setup permissions for <datahub-role> to query DMF results
 | |
| grant application role SNOWFLAKE.DATA_QUALITY_MONITORING_VIEWER to role "<datahub_role>"
 | |
| ```
 | |
| 
 | |
| ## Supported Assertion Types
 | |
| 
 | |
| The following assertion types are currently supported by the DataHub Snowflake DMF Assertion Compiler:
 | |
| 
 | |
| - [Freshness](/docs/managed-datahub/observe/freshness-assertions.md)
 | |
| - [Volume](/docs/managed-datahub/observe/volume-assertions.md)
 | |
| - [Column](/docs/managed-datahub/observe/column-assertions.md)
 | |
| - [Custom SQL](/docs/managed-datahub/observe/custom-sql-assertions.md)
 | |
| 
 | |
| Note that Schema Assertions are not currently supported.
 | |
| 
 | |
| ## Creating Snowflake DMF Assertions
 | |
| 
 | |
| The process for declaring and running assertions backend by Snowflake DMFs consists of a few steps, which will be outlined
 | |
| in the following sections.
 | |
| 
 | |
| ### Step 1. Define your Data Quality assertions using Assertion YAML files
 | |
| 
 | |
| See the section **Declaring Assertions in YAML** below for examples of how to define assertions in YAML.
 | |
| 
 | |
| ### Step 2. Register your assertions with DataHub
 | |
| 
 | |
| Use the DataHub CLI to register your assertions with DataHub, so they become visible in the DataHub UI:
 | |
| 
 | |
| ```bash
 | |
| datahub assertions upsert -f examples/library/assertions_configuration.yml
 | |
| ```
 | |
| 
 | |
| ### Step 3. Compile the assertions into Snowflake DMFs using the DataHub CLI
 | |
| 
 | |
| Next, we'll use the `assertions compile` command to generate the SQL code for the Snowflake DMFs,
 | |
| which can then be registered in Snowflake.
 | |
| 
 | |
| ```bash
 | |
| datahub assertions compile -f examples/library/assertions_configuration.yml -p snowflake -x DMF_SCHEMA=<db>.<schema-where-DMF-should-live>
 | |
| ```
 | |
| 
 | |
| Two files will be generated as output of running this command:
 | |
| 
 | |
| - `dmf_definitions.sql`: This file contains the SQL code for the DMFs that will be registered in Snowflake.
 | |
| - `dmf_associations.sql`: This file contains the SQL code for associating the DMFs with the target tables in Snowflake.
 | |
| 
 | |
| By default in a folder called `target`. You can use config option `-o <output_folder>` in `compile` command to write these compile artifacts in another folder.
 | |
| 
 | |
| Each of these artifacts will be important for the next steps in the process.
 | |
| 
 | |
| _dmf_definitions.sql_
 | |
| 
 | |
| This file stores the SQL code for the DMFs that will be registered in Snowflake, generated
 | |
| from your YAML assertion definitions during the compile step.
 | |
| 
 | |
| ```sql
 | |
| -- Example dmf_definitions.sql
 | |
| 
 | |
| -- Start of Assertion 5c32eef47bd763fece7d21c7cbf6c659
 | |
| 
 | |
|             CREATE or REPLACE DATA METRIC FUNCTION
 | |
|             test_db.datahub_dmfs.datahub__5c32eef47bd763fece7d21c7cbf6c659 (ARGT TABLE(col_date DATE))
 | |
|             RETURNS NUMBER
 | |
|             COMMENT = 'Created via DataHub for assertion urn:li:assertion:5c32eef47bd763fece7d21c7cbf6c659 of type volume'
 | |
|             AS
 | |
|             $$
 | |
|             select case when metric <= 1000 then 1 else 0 end from (select count(*) as metric from TEST_DB.PUBLIC.TEST_ASSERTIONS_ALL_TIMES )
 | |
|             $$;
 | |
| 
 | |
| -- End of Assertion 5c32eef47bd763fece7d21c7cbf6c659
 | |
| ....
 | |
| ```
 | |
| 
 | |
| _dmf_associations.sql_
 | |
| 
 | |
| This file stores the SQL code for associating with the target table,
 | |
| along with scheduling the generated DMFs to run on at particular times.
 | |
| 
 | |
| ```sql
 | |
| -- Example dmf_associations.sql
 | |
| 
 | |
| -- Start of Assertion 5c32eef47bd763fece7d21c7cbf6c659
 | |
| 
 | |
|             ALTER TABLE TEST_DB.PUBLIC.TEST_ASSERTIONS_ALL_TIMES SET DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
 | |
|             ALTER TABLE TEST_DB.PUBLIC.TEST_ASSERTIONS_ALL_TIMES ADD DATA METRIC FUNCTION test_db.datahub_dmfs.datahub__5c32eef47bd763fece7d21c7cbf6c659 ON (col_date);
 | |
| 
 | |
| -- End of Assertion 5c32eef47bd763fece7d21c7cbf6c659
 | |
| ....
 | |
| ```
 | |
| 
 | |
| ### Step 4. Register the compiled DMFs in your Snowflake environment
 | |
| 
 | |
| Next, you'll need to run the generated SQL from the files output in Step 3 in Snowflake.
 | |
| 
 | |
| You can achieve this either by running the SQL files directly in the Snowflake UI, or by using the SnowSQL CLI tool:
 | |
| 
 | |
| ```bash
 | |
| snowsql -f dmf_definitions.sql
 | |
| snowsql -f dmf_associations.sql
 | |
| ```
 | |
| 
 | |
| :::NOTE
 | |
| Scheduling Data Metric Function on table incurs Serverless Credit Usage in Snowflake. Refer [Billing and Pricing](https://docs.snowflake.com/en/user-guide/data-quality-intro#billing-and-pricing) for more details.
 | |
| Please ensure you DROP Data Metric Function created via dmf_associations.sql if the assertion is no longer in use.
 | |
| :::
 | |
| 
 | |
| ### Step 5. Run ingestion to report the results back into DataHub
 | |
| 
 | |
| Once you've registered the DMFs, they will be automatically executed, either when the target table is updated or on a fixed
 | |
| schedule.
 | |
| 
 | |
| To report the results of the generated Data Quality assertions back into DataHub, you'll need to run the DataHub ingestion process with a special configuration
 | |
| flag: `include_assertion_results: true`:
 | |
| 
 | |
| ```yaml
 | |
| # Your DataHub Snowflake Recipe
 | |
| source:
 | |
|   type: snowflake
 | |
|   config:
 | |
|     # ...
 | |
|     include_assertion_results: True
 | |
|     # ...
 | |
| ```
 | |
| 
 | |
| During ingestion we will query for the latest DMF results stored in Snowflake, convert them into DataHub Assertion Results, and report the results back into DataHub during your ingestion process
 | |
| either via CLI or the UI visible as normal assertions.
 | |
| 
 | |
| `datahub ingest -c snowflake.yml`
 | |
| 
 | |
| ## Caveats
 | |
| 
 | |
| - Currently, Snowflake supports at most 1000 DMF-table associations at the moment so you can not define more than 1000 assertions for snowflake.
 | |
| - Currently, Snowflake does not allow JOIN queries or non-deterministic functions in DMF definition so you can not use these in SQL for SQL assertion or in filters section.
 | |
| - Currently, all DMFs scheduled on a table must follow same exact schedule, so you can not set assertions on same table to run on different schedules.
 | |
| - Currently, DMFs are only supported for regular tables and not dynamic or external tables.
 | |
| 
 | |
| ## FAQ
 | |
| 
 | |
| Coming soon!
 | 
