> ## Documentation Index
> Fetch the complete documentation index at: https://docs.maia.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Azure Blob Storage Unload

export const designer = "Designer";

export const ComponentMetadata = ({warehouses, unsupportedWarehouses = [], componentType, connectionInputs, connectionOutputs}) => {
  const allWarehouses = [...warehouses.map(w => ({
    name: w,
    supported: true
  })), ...unsupportedWarehouses.map(w => ({
    name: w,
    supported: false
  }))];
  return <div style={{
    background: 'var(--colors-background-light, #f9fafb)',
    border: '1px solid var(--colors-border-default, #e5e7eb)',
    borderRadius: '12px',
    padding: '20px 28px',
    marginBottom: '28px',
    boxShadow: '0 1px 4px rgba(0,0,0,0.10)'
  }}>
      <table style={{
    width: '100%',
    borderCollapse: 'collapse'
  }}>
        <tbody>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle',
    width: '180px'
  }}>Project Availability</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>
              <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '8px'
  }}>
                {allWarehouses.map((w, i) => <span key={i} style={{
    background: w.supported ? '#dcfce7' : '#fee2e2',
    color: w.supported ? '#15803d' : '#b91c1c',
    border: `1px solid ${w.supported ? '#bbf7d0' : '#fca5a5'}`,
    borderRadius: '9999px',
    padding: '3px 12px',
    fontSize: '0.85rem',
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
                    {w.name} {w.supported ? '✅' : '❌'}
                  </span>)}
              </div>
            </td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Component Type</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>{componentType}</td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Connection Inputs</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>{connectionInputs}</td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Connection Outputs</td>
            <td style={{
    verticalAlign: 'middle'
  }}>{connectionOutputs}</td>
          </tr>
        </tbody>
      </table>
    </div>;
};

<ComponentMetadata warehouses={["Snowflake", "Databricks"]} unsupportedWarehouses={["Amazon Redshift", "Google BigQuery"]} componentType="Connector, Orchestration" connectionInputs="One" connectionOutputs="Unlimited" />

Azure Blob Storage Unload is an orchestration component that creates files on a specified Azure Blob Storage account and populates those files by copying data from a designated table or view.

By default, your data will be unloaded in parallel.

<Warning>
  We have identified issues when using the Azure Blob Storage Unload component for Databricks with [Serverless SQL warehouses](https://learn.microsoft.com/en-gb/azure/databricks/compute/serverless/) or [Classic SQL warehouses](https://learn.microsoft.com/en-gb/azure/databricks/compute/sql-warehouse/). Our team is actively investigating these issues to improve the component's functionality. In the meantime, we recommend using an [All-purpose compute](https://learn.microsoft.com/en-gb/azure/databricks/compute/use-compute) as a temporary workaround.
</Warning>

If the component requires access to a cloud provider (AWS, Azure, or Google Cloud), it will use credentials as follows:

* If using [Matillion Full SaaS](/docs/guides/runner-overview#matillion-full-saas): The component will use the [cloud credentials](/docs/guides/cloud-credentials) associated with your environment to access resources.
* If using [Hybrid SaaS](/docs/guides/runner-overview#hybrid-saas): By default the component will inherit the agent's execution role (service account role). However, if there are [cloud credentials](/docs/guides/cloud-credentials) associated to your environment, these will overwrite the role.

***

## Properties

<Tabs>
  <Tab title="Snowflake">
    <ResponseField name="Name" type="string" required>
      A human-readable name for the component.
    </ResponseField>

    <ResponseField name="Stage" type="drop-down" required>
      Select a staging area for the data. Staging areas can be created through Snowflake using the [CREATE STAGE](https://docs.snowflake.net/manuals/sql-reference/sql/create-stage.html) command. Internal stages can be set up this way to store staged data within Snowflake. Selecting \[Custom] will avail the user of properties to specify a custom staging area on Azure Blob Storage. Users can add a fully qualified stage by typing the stage name. This should follow the format `databaseName.schemaName.stageName`.
    </ResponseField>

    <ResponseField name="Azure Storage Location" type="file explorer" required>
      To retrieve the intended files, use the file explorer to enter the container path where the Azure storage account is located, or select from the list of storage accounts.

      This must have the format `AZURE://<StorageAccount>/<path>`.

      If the specified container path doesn't exist, Azure Blob Storage Unload creates it automatically. If the source table or query returns no rows, no files are written to Azure Blob Storage.
    </ResponseField>

    <ResponseField name="File Prefix" type="string" required>
      Specify a file prefix for unloaded data on the blob container. Each file will be named as the prefix followed by a number denoting which node this was unloaded from. All unloads are parallel, and will use the maximum number of nodes available at the time.
    </ResponseField>

    <ResponseField name="Authentication" type="drop-down" required>
      Select the authentication method. Users can choose either:

      * **Credentials:** Uses Azure security credentials.
      * **Storage Integration:** Use a Snowflake storage integration. A storage integration is a Snowflake object that stores a generated identity and access management (IAM) entity for your external cloud storage, along with an optional set of permitted or blocked storage locations (Amazon S3, Google Cloud Storage, or Microsoft Azure Blob Storage). More information can be found at [CREATE STORAGE INTEGRATION](https://docs.snowflake.com/en/sql-reference/sql/create-storage-integration.html).
    </ResponseField>

    <ResponseField name="Warehouse" type="drop-down" required>
      The Snowflake warehouse used to run the queries. The special value `[Environment Default]` uses the warehouse defined in the environment. Read [Overview of Warehouses](https://docs.snowflake.com/en/user-guide/warehouses-overview.html) to learn more.
    </ResponseField>

    <ResponseField name="Database" type="drop-down" required>
      The Snowflake database. The special value `[Environment Default]` uses the database defined in the environment. Read [Databases, Tables and Views - Overview](https://docs.snowflake.com/en/guides-overview-db) to learn more.
    </ResponseField>

    <ResponseField name="Schema" type="drop-down" required>
      The Snowflake schema. The special value `[Environment Default]` uses the schema defined in the environment. Read [Database, Schema, and Share DDL](https://docs.snowflake.com/en/sql-reference/ddl-database.html) to learn more.
    </ResponseField>

    {/* <!-- param-start:[tableName] | warehouses: [snowflake] --> */}

    <ResponseField name="Target Table" type="drop-down" required>
      Select an existing table. The tables available for selection depend on the chosen schema.
    </ResponseField>

    <ResponseField name="Format" type="drop-down" required>
      Select a pre-made file format that will automatically set many of the Azure unload component properties. These formats can be created through the [Create File Format](/docs/components/create-file-format) component. Selecting the \[Custom] file format will use the component properties to define the file format.
    </ResponseField>

    <ResponseField name="File Type" type="drop-down" required>
      The unload file format. Choose from CSV, JSON, or PARQUET. Some file types may require additional formatting—this is explained in the Snowflake documentation. Component properties will change to reflect the selected file type.
    </ResponseField>

    {/* <!-- param-start:[compression] | warehouses: [snowflake] --> */}

    <ResponseField name="Compression" type="drop-down" required>
      Select the compression format. Available CSV and JSON formats include:

      * BROTLI
      * BZ2
      * DEFLATE
      * gzip
      * NONE (no compression)
      * RAW\_DEFLATE
      * ZSTD

      Available PARQUET formats include:

      * AUTO
      * LZO
      * NONE (no compression)
      * SNAPPY
    </ResponseField>

    <Tabs>
      <Tab title="CSV">
        {/* <!-- param-start:[recordDelimiter] | warehouses: [snowflake] --> */}

        <ResponseField name="Record Delimiter" type="string" required>
          Specify a delimiter character to separate records (rows) in the file. Defaults to newline. `\` can also signify a newline. `\\r` can signify a carriage return.
        </ResponseField>

        {/* <!-- param-end:[recordDelimiter] --> */}

        <ResponseField name="Field Delimiter" type="string" required>
          Specify a delimiter character to separate columns. The default character is a comma `,`.

          A \[TAB] character can be specified as `\`.
        </ResponseField>

        {/* <!-- param-start:[dateFormat] | warehouses: [snowflake] --> */}

        <ResponseField name="Date Format" type="string" required>
          Defaults to **auto**. Use this property to manually specify a date format. For more information, read the [Snowflake documentation](https://docs.snowflake.com/en/sql-reference/data-types-datetime.html#date).
        </ResponseField>

        {/* <!-- param-end:[dateFormat] --> */}

        <ResponseField name="Time Format" type="string" required>
          Defaults to **auto**. Use this property to manually specify a time format. For more information, read the [Snowflake documentation](https://docs.snowflake.com/en/sql-reference/data-types-datetime.html#time).
        </ResponseField>

        {/* <!-- param-start:[timestampFormat] | warehouses: [snowflake] --> */}

        <ResponseField name="Timestamp Format" type="string" required>
          Defaults to **auto**. Use this property to manually specify a timestamp format. For more information, read the [Snowflake documentation](https://docs.snowflake.com/en/sql-reference/data-types-datetime.html#timestamp).
        </ResponseField>

        {/* <!-- param-end:[timestampFormat] --> */}

        {/* <!-- param-start:[escape] | warehouses: [snowflake] --> */}

        <ResponseField name="Escape" type="string" required>
          Specify a single character to be used as the escape character for field values that are enclosed. Default is `NONE`.
        </ResponseField>

        {/* <!-- param-end:[escape] --> */}

        <ResponseField name="Escape Unenclosed Field" type="string" required>
          Specify a single character to be used as the escape character for unenclosed field values only. Accepts common escape sequences, octal values, or hex values. Also accepts a value of NONE (default). Default is `\`.

          If a character is specified in the "Escape" field, it will override this field.

          If you have set a value in the property **Field Optionally Enclosed**, all fields will become enclosed, rendering the **Escape Unenclosed Field** property redundant, in which case it will be ignored.
        </ResponseField>

        <ResponseField name="Field Optionally Enclosed" type="string" required>
          A character that is used to enclose strings. Can be single quote (') or double quote (") or NONE (default). Note that the character chosen can be escaped by that same character.
        </ResponseField>
      </Tab>

      <Tab title="JSON">
        <ResponseField name="Nest Columns" type="drop-down" required>
          When "True", the table columns will be nested into a single JSON object so that the file can be configured correctly. A table with a single variant column will not require this setting to be "True". The default setting is "False".
        </ResponseField>
      </Tab>
    </Tabs>

    <ResponseField name="Null If" type="string" required>
      Specify one or more strings (one string per row of the table) to convert to NULL values. When one of these strings is encountered in the file, it is replaced with a SQL NULL value for that field in the loaded table. Click **+** to add a string.
    </ResponseField>

    <ResponseField name="Trim Space" type="drop-down" required>
      (JSON and PARQUET only) Removes trailing and leading whitespace from the input data.
    </ResponseField>

    <ResponseField name="Overwrite" type="drop-down" required>
      When "True", overwrite existing data (if the target file already exists) instead of generating an error. Default setting is "False".
    </ResponseField>

    <ResponseField name="Single File" type="drop-down" required>
      When **True**, the unload operation will work in serial rather than parallel. This results in a slower unload but a single, complete file.

      The default setting is **False**.

      When **True**, no file extension is used in the output filename (regardless of the file type, and regardless of whether the file is compressed).

      When **False**, a filename prefix must be included in the path.
    </ResponseField>

    <ResponseField name="Max File Size" type="integer" required>
      The maximum size (in bytes) of each file generated.

      The default is **16000000** (16 MB). The maximum size is **5000000000** (5 GB).

      For more information, see the [Snowflake documentation](https://docs.snowflake.com/en/user-guide/data-unload-considerations.html#unloading-to-a-single-file).
    </ResponseField>

    <ResponseField name="Include Headers" type="drop-down" required>
      When "True", write column names as headers at the top of the unloaded files. Default is "False".
    </ResponseField>
  </Tab>

  <Tab title="Databricks">
    <ResponseField name="Name" type="string" required>
      A human-readable name for the component.
    </ResponseField>

    {/* <!-- param-start:[azureStorageLocation] | warehouses: [databricks] --> */}

    <ResponseField name="Azure Storage Location" type="URL" required>
      Use the file explorer to enter the container path where the Azure storage account is located, or select from the list of storage accounts.

      If the specified container path doesn't exist, Azure Blob Storage Unload creates it automatically. If the source table or query returns no rows, no files are written to Azure Blob Storage. However, the target directory is still created.
    </ResponseField>

    {/* <!-- param-start:[catalog] | warehouses: [databricks] --> */}

    <ResponseField name="Catalog" type="drop-down" required>
      Select a [Databricks Unity Catalog](https://docs.databricks.com/en/data-governance/unity-catalog/index.html). The special value `[Environment Default]` uses the catalog defined in the environment. Selecting a catalog will determine which databases are available in the next parameter.
    </ResponseField>

    {/* <!-- param-start:[schema] | warehouses: [databricks] --> */}

    <ResponseField name="Schema (Database)" type="drop-down" required>
      The Databricks schema. The special value `[Environment Default]` uses the schema defined in the environment. Read [Create and manage schemas](https://docs.databricks.com/en/data-governance/unity-catalog/create-schemas.html) to learn more.
    </ResponseField>

    {/* <!-- param-start:[tableName] | warehouses: [databricks] --> */}

    <ResponseField name="Table Name" type="drop-down" required>
      The table to unload to Azure Blob Storage.
    </ResponseField>

    {/* <!-- param-start:[fileType] | warehouses: [databricks] --> */}

    <ResponseField name="File Type" type="select" required>
      Select the file type. Available types include AVRO, CSV, JSON, and PARQUET. Below properties will change to reflect the selected file type.
    </ResponseField>

    {/* <!-- param-start:[compression] | warehouses: [databricks] --> */}

    <ResponseField name="Compression" type="drop-down">
      Select the compression format. The default is set to empty. This setting doesn't apply to AVRO.

      Available CSV, JSON, and PARQUET formats include:

      * GZIP
      * BZIP2
      * DEFLATE
      * LZ4
      * SNAPPY
    </ResponseField>

    <Tabs>
      <Tab title="CSV">
        {/* <!-- param-start:[recordDelimiter] | warehouses: [databricks] --> */}

        <ResponseField name="Record Delimiter" type="string">
          A delimiter character used in delimited text formats. The default is a comma.
        </ResponseField>

        {/* <!-- param-end:[recordDelimiter] --> */}

        {/* <!-- param-start:[quote] | warehouses: [databricks] --> */}

        <ResponseField name="Quote" type="string">
          Sets the quote character for delimited text formats to enclose values containing the delimiter character. The default is `"`.
        </ResponseField>

        {/* <!-- param-end:[quote] --> */}

        {/* <!-- param-start:[dateFormat] | warehouses: [databricks] --> */}

        <ResponseField name="Date Format" type="string">
          Manually set a date format. If none is set, the default is `yyyy-MM-dd`.
        </ResponseField>

        {/* <!-- param-end:[dateFormat] --> */}

        {/* <!-- param-start:[timestampFormat] | warehouses: [databricks] --> */}

        <ResponseField name="Timestamp Format" type="string">
          Manually set a timestamp format. If none is set, the default is `yyyy-MM-dd'T'HH:mm:ss.[SSS][XXX]`.
        </ResponseField>

        {/* <!-- param-end:[timestampFormat] --> */}

        {/* <!-- param-start:[escape] | warehouses: [databricks] --> */}

        <ResponseField name="Escape" type="string">
          Sets the escape character used in delimited text formats to escape special characters. The default is `\`.
        </ResponseField>

        {/* <!-- param-end:[escape] --> */}

        {/* <!-- param-start:[nullValue] | warehouses: [databricks] --> */}

        <ResponseField name="Null Value" type="string">
          Sets the string representation of a null value in the input data. The default value is an empty string.
        </ResponseField>

        {/* <!-- param-end:[nullValue] --> */}

        {/* <!-- param-start:[header] | warehouses: [databricks] --> */}

        <ResponseField name="Header" type="boolean" required>
          Specify whether the input data has a header row. Default is `False`.
        </ResponseField>

        {/* <!-- param-end:[header] --> */}

        {/* <!-- param-start:[escapeQuotes] | warehouses: [databricks] --> */}

        <ResponseField name="Escape Quotes" type="boolean" required>
          Specify whether to escape quote characters. The default is `True`.
        </ResponseField>

        {/* <!-- param-end:[escapeQuotes] --> */}
      </Tab>

      <Tab title="JSON">
        {/* <!-- param-start:[dateFormat] | warehouses: [databricks] --> */}

        <ResponseField name="Date Format" type="string">
          Manually set a date format. If none is set, the default is `yyyy-MM-dd`.
        </ResponseField>

        {/* <!-- param-end:[dateFormat] --> */}

        {/* <!-- param-start:[timestampFormat] | warehouses: [databricks] --> */}

        <ResponseField name="Timestamp Format" type="string">
          Manually set a timestamp format. If none is set, the default is `yyyy-MM-dd'T'HH:mm:ss.[SSS][XXX]`.
        </ResponseField>

        {/* <!-- param-end:[timestampFormat] --> */}
      </Tab>
    </Tabs>

    <ResponseField name="Write Mode" type="drop-down" required>
      When unloading data to Azure Blob Storage, choose from the following options:

      * **APPEND:** Add the new file to the existing directory.
      * **OVERWRITE:** Completely clear the directory before adding a new file.
    </ResponseField>
  </Tab>
</Tabs>

***

## Copying files to an Azure Premium Storage blob

When copying files to an Azure Premium Storage blob, <designer /> may provide the following error:

```
Self-suppression not permitted.
```

This is because, unlike standard Azure Storage, Azure Premium Storage does **not** support block blobs, append blobs, files, tables, or queues. Premium Storage supports only page blobs that are incrementally sized.

A page blob is a collection of 512-byte pages that are optimized for random read and write operations. Thus, all writes must be 512-byte aligned and so any file that is not sized a multiple of 512 will fail to write.

For additional information about Azure Storage blobs, we recommend consulting the [Microsoft Azure documentation](https://learn.microsoft.com/en-us/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs).
