Qlik Sense
Important Capabilities
| Capability | Status | Notes | 
|---|---|---|
| Asset Containers | ✅ | Enabled by default | 
| Column-level Lineage | ✅ | Disabled by default. | 
| Descriptions | ✅ | Enabled by default | 
| Detect Deleted Entities | ✅ | Optionally enabled via stateful_ingestion.remove_stale_metadata | 
| Extract Ownership | ✅ | Enabled by default, configured using ingest_owner | 
| Platform Instance | ✅ | Enabled by default | 
| Schema Metadata | ✅ | Enabled by default | 
| Table-Level Lineage | ✅ | Enabled by default. | 
This plugin extracts the following:
- Qlik Sense Spaces and Apps as Container.
 - Qlik Datasets
 - Sheets as dashboard and its charts
 
Integration Details
This source extracts the following:
- Accessible spaces and apps within that spaces as Container.
 - Qlik Datasets as Datahub Datasets with schema metadata.
 - Sheets as Datahub dashboard and charts present inside sheets.
 
Configuration Notes
- Refer doc to generate an API key from the hub.
 - Get tenant hostname from About tab after login to qlik sense account.
 
Concept mapping
| Qlik Sense | Datahub | Notes | 
|---|---|---|
Space | Container | SubType "Qlik Space" | 
App | Container | SubType "Qlik App" | 
Sheet | Dashboard | |
Chart | Chart | |
Dataset | Dataset | SubType "Qlik Dataset" | 
User | User (a.k.a CorpUser) | Optionally Extracted | 
CLI based Ingestion
Starter Recipe
Check out the following recipe to get started with ingestion! See below for full configuration options.
For general pointers on writing and running a recipe, see our main recipe guide.
source:
  type: qlik-sense
  config:
    # Coordinates
    tenant_hostname: "xyz12xz.us.qlikcloud.com"
    # Credentials
    api_key: "QLIK_API_KEY"
    
    # Optional - filter for certain space names instead of ingesting everything.
    # Mention 'personal_space' if entities of personal space need to ingest
    # space_pattern:
    #   allow:
    #     - space_name
    ingest_owner: true
    
    # Optional -- This mapping is optional and only required to configure platform-instance for Qlik app dataset upstream source tables
    # A mapping of the Qlik app dataset upstream tables from data connection to platform instance. Use 'data_connection_name' as key.
    # data_connection_to_platform_instance:
    #   data_connection_name:
    #     platform_instance: cloud_instance
    #     env: DEV
sink:
  # sink configs
Config Details
- Options
 - Schema
 
Note that a . is used to denote nested fields in the YAML recipe.
| Field | Description | 
|---|---|
api_key ✅  string  | Qlik API Key | 
tenant_hostname ✅  string  | Qlik Tenant hostname | 
ingest_owner  boolean  | Ingest Owner from source. This will override Owner info entered from UI  Default: True  | 
platform_instance  string  | The instance of the platform that all assets produced by this recipe belong to. This should be unique within the platform. See https://datahubproject.io/docs/platform-instances/ for more details. | 
env  string  | The environment that all assets produced by this connector belong to  Default: PROD  | 
data_connection_to_platform_instance  map(str,PlatformDetail)  | Any source that connects to a platform should inherit this class | 
data_connection_to_platform_instance.  key.envstring  | The environment that all assets produced by this connector belong to  Default: PROD  | 
data_connection_to_platform_instance.  key.platform_instancestring  | The instance of the platform that all assets produced by this recipe belong to. This should be unique within the platform. See https://datahubproject.io/docs/platform-instances/ for more details. | 
space_pattern  AllowDenyPattern  | Regex patterns to filter Qlik spaces in ingestion.Mention 'personal_space' if entities of personal space need to ingest  Default: {'allow': ['.*'], 'deny': [], 'ignoreCase': True}  | 
space_pattern.ignoreCase  boolean  | Whether to ignore case sensitivity during pattern matching.  Default: True  | 
space_pattern.allow  array  | List of regex patterns to include in ingestion  Default: ['.*']  | 
space_pattern.allow.string  string  | |
space_pattern.deny  array  | List of regex patterns to exclude from ingestion.  Default: []  | 
space_pattern.deny.string  string  | |
stateful_ingestion  StatefulIngestionConfig  | Stateful Ingestion Config | 
stateful_ingestion.enabled  boolean  | Whether or not to enable stateful ingest. Default: True if a pipeline_name is set and either a datahub-rest sink or datahub_api is specified, otherwise False Default: False  | 
The JSONSchema for this configuration is inlined below.
{
  "title": "QlikSourceConfig",
  "description": "Base configuration class for stateful ingestion for source configs to inherit from.",
  "type": "object",
  "properties": {
    "env": {
      "title": "Env",
      "description": "The environment that all assets produced by this connector belong to",
      "default": "PROD",
      "type": "string"
    },
    "platform_instance": {
      "title": "Platform Instance",
      "description": "The instance of the platform that all assets produced by this recipe belong to. This should be unique within the platform. See https://datahubproject.io/docs/platform-instances/ for more details.",
      "type": "string"
    },
    "stateful_ingestion": {
      "title": "Stateful Ingestion",
      "description": "Stateful Ingestion Config",
      "allOf": [
        {
          "$ref": "#/definitions/StatefulIngestionConfig"
        }
      ]
    },
    "tenant_hostname": {
      "title": "Tenant Hostname",
      "description": "Qlik Tenant hostname",
      "type": "string"
    },
    "api_key": {
      "title": "Api Key",
      "description": "Qlik API Key",
      "type": "string"
    },
    "space_pattern": {
      "title": "Space Pattern",
      "description": "Regex patterns to filter Qlik spaces in ingestion.Mention 'personal_space' if entities of personal space need to ingest",
      "default": {
        "allow": [
          ".*"
        ],
        "deny": [],
        "ignoreCase": true
      },
      "allOf": [
        {
          "$ref": "#/definitions/AllowDenyPattern"
        }
      ]
    },
    "ingest_owner": {
      "title": "Ingest Owner",
      "description": "Ingest Owner from source. This will override Owner info entered from UI",
      "default": true,
      "type": "boolean"
    },
    "data_connection_to_platform_instance": {
      "title": "Data Connection To Platform Instance",
      "description": "A mapping of the Qlik app dataset upstream tables from data connection to platform instance.Use 'data_connection_name' as key.",
      "default": {},
      "type": "object",
      "additionalProperties": {
        "$ref": "#/definitions/PlatformDetail"
      }
    }
  },
  "required": [
    "tenant_hostname",
    "api_key"
  ],
  "additionalProperties": false,
  "definitions": {
    "DynamicTypedStateProviderConfig": {
      "title": "DynamicTypedStateProviderConfig",
      "type": "object",
      "properties": {
        "type": {
          "title": "Type",
          "description": "The type of the state provider to use. For DataHub use `datahub`",
          "type": "string"
        },
        "config": {
          "title": "Config",
          "description": "The configuration required for initializing the state provider. Default: The datahub_api config if set at pipeline level. Otherwise, the default DatahubClientConfig. See the defaults (https://github.com/datahub-project/datahub/blob/master/metadata-ingestion/src/datahub/ingestion/graph/client.py#L19).",
          "default": {},
          "type": "object"
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": false
    },
    "StatefulIngestionConfig": {
      "title": "StatefulIngestionConfig",
      "description": "Basic Stateful Ingestion Specific Configuration for any source.",
      "type": "object",
      "properties": {
        "enabled": {
          "title": "Enabled",
          "description": "Whether or not to enable stateful ingest. Default: True if a pipeline_name is set and either a datahub-rest sink or `datahub_api` is specified, otherwise False",
          "default": false,
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "AllowDenyPattern": {
      "title": "AllowDenyPattern",
      "description": "A class to store allow deny regexes",
      "type": "object",
      "properties": {
        "allow": {
          "title": "Allow",
          "description": "List of regex patterns to include in ingestion",
          "default": [
            ".*"
          ],
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "deny": {
          "title": "Deny",
          "description": "List of regex patterns to exclude from ingestion.",
          "default": [],
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "ignoreCase": {
          "title": "Ignorecase",
          "description": "Whether to ignore case sensitivity during pattern matching.",
          "default": true,
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "PlatformDetail": {
      "title": "PlatformDetail",
      "description": "Any source that connects to a platform should inherit this class",
      "type": "object",
      "properties": {
        "env": {
          "title": "Env",
          "description": "The environment that all assets produced by this connector belong to",
          "default": "PROD",
          "type": "string"
        },
        "platform_instance": {
          "title": "Platform Instance",
          "description": "The instance of the platform that all assets produced by this recipe belong to. This should be unique within the platform. See https://datahubproject.io/docs/platform-instances/ for more details.",
          "type": "string"
        }
      },
      "additionalProperties": false
    }
  }
}
Code Coordinates
- Class Name: 
datahub.ingestion.source.qlik_sense.qlik_sense.QlikSenseSource - Browse on GitHub
 
Questions
If you've got any questions on configuring ingestion for Qlik Sense, feel free to ping us on our Slack.
Is this page helpful?