> ## 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.

# Google Cloud Storage Unload

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", "Google BigQuery"]} unsupportedWarehouses={["Databricks", "Amazon Redshift"]} componentType="Connector, Orchestration" connectionInputs="One" connectionOutputs="Unlimited" />

The Cloud Storage Unload component writes data from a table or view into a specified Google Cloud Storage (GCS) bucket using your specified file format (CSV, JSON, Parquet, or Avro, depending on your data warehouse).

This component requires working Google Cloud Storage credentials with "write" access to the source data files.

If the component requires access to a cloud provider (AWS, Azure, or Google Cloud), it will use the [cloud credentials](/docs/guides/cloud-credentials) associated with your environment to access resources.

***

## Properties

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

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

    <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.com/en/sql-reference/sql/create-stage.html) command. Internal stages can be set up this way to store staged data within Snowflake. Selecting \[Custom] will allow the user to specify a custom staging area.
    </ResponseField>

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

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

    <ResponseField name="Google Storage URL location" type="file explorer" required>
      To retrieve the intended files, use the file explorer to enter the container path where the Google Cloud Storage bucket is located, or select from the list of GCS buckets.

      This must have the format `GS://<bucket>/<path>`.
    </ResponseField>

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

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

    <ResponseField name="File prefix" type="string" required>
      A prefix applied to the filenames created in the GCS bucket. Each created file will be named using 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.

      The default prefix is `data`.
    </ResponseField>

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

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

    <ResponseField name="Storage integration" type="drop-down" required>
      Select the storage integration. Storage integrations are required to permit Snowflake to read from and write to a cloud storage location. Integrations must be set up in advance and configured to support Google Cloud Storage.
    </ResponseField>

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

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

    <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>

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

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

    <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>

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

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

    <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-end:[schema] --> */}

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

    <ResponseField name="Target table" type="string" required>
      Choose a target table to unload data from into a GCS bucket.

      <Warning>
        This table will be recreated and any existing table of the same name will be dropped.
      </Warning>
    </ResponseField>

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

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

    <ResponseField name="Format" type="drop-down" required>
      Select a pre-made file format that will automatically set many of the Google Cloud Storage Unload component properties. These formats can be created through the [Create File Format](/docs/components/create-file-format) component. Select \[Custom] to specify a custom format using the properties available in this component.
    </ResponseField>

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

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

    <ResponseField name="File type" type="drop-down" required>
      Select the type of data for the unloaded data. Available data types are: CSV, JSON, and PARQUET. For additional information on file type options, read the [Snowflake documentation](https://docs.snowflake.net/manuals/sql-reference/sql/create-file-format.html).

      Component properties will change to reflect the selected file type. Click one of the tabs below for properties applicable to that file type.
    </ResponseField>

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

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

        <ResponseField name="Compression" type="drop-down" required>
          Select the compression method if you wish to compress your data. If you do not wish to compress at all, select NONE. The default setting is AUTO.
        </ResponseField>

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

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

        <ResponseField name="Record delimiter" type="string" required>
          Input a delimiter for records. This can be one or more single-byte or multibyte characters that separate records in the output file.

          Accepted values include: leaving the field empty; a newline character `\` or its hex equivalent `0x0a`; a carriage return `\\r` or its hex equivalent `0x0d`. Also accepts a value of NONE.

          The specified delimiter must be a valid UTF-8 character and not a random sequence of bytes.

          Do not specify characters used for other file type options such as **Escape** or **Escape unenclosed field**.

          If the field is left blank, the default record delimiter is a newline character.

          This delimiter is limited to a maximum of 20 characters.

          While multi-character delimiters are supported, the record delimiter cannot be a substring of the field delimiter, and vice versa. For example, if the record delimiter is "aa", the field delimiter cannot be "aabb".
        </ResponseField>

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

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

        <ResponseField name="Field delimiter" type="string" required>
          Input a delimiter for fields. This can be one or more single-byte or multibyte characters that separate fields in the output file.

          Accepted characters include common escape sequences, octal values (prefixed by \\), or hex values (prefixed by 0x). Also accepts a value of NONE.

          This delimiter is limited to a maximum of 20 characters.

          While multi-character delimiters are supported, the field delimiter cannot be a substring of the record delimiter, and vice versa. For example, if the field delimiter is "aa", the record delimiter cannot be "aabb".

          The specified delimiter must be a valid UTF-8 character and not a random sequence of bytes.

          Do not specify characters used for other file type options such as **Escape** or **Escape unenclosed field**.

          The default setting is a comma: `,`.
        </ResponseField>

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

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

        <ResponseField name="Date format" type="string" required>
          Define the format of date values in the data. If a value is not specified or is AUTO, the value for the DATE\_INPUT\_FORMAT session parameter is used. The default setting is AUTO.
        </ResponseField>

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

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

        <ResponseField name="Time format" type="string" required>
          Define the format of time values in the data. If a value is not specified or is AUTO, the value for the TIME\_INPUT\_FORMAT session parameter is used. The default setting is AUTO.
        </ResponseField>

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

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

        <ResponseField name="Timestamp format" type="string" required>
          Define the format of timestamp values in the data. If a value is not specified or is AUTO, the value for the TIMESTAMP\_INPUT\_FORMAT session parameter is used.
        </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] --> */}

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

        <ResponseField name="Escape unenclosed field" type="string" required>
          Specify a single character to be used as the escape character for unenclosed field values only. Default is `\\`. 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>

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

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

        <ResponseField name="Field optionally enclosed" type="string" required>
          Specify a character used to enclose strings. The value can be NONE, single quote character `'`, or double quote character `"`. To use the single quote character, use the octal or hex representation `0x27` or the double single-quoted escape `''`. Default is NONE.

          When a field contains one of these characters, escape the field using the same character. For example, to escape a string like this: `1 "2" 3`, use double quotation to escape, like this: `1 ""2"" 3`.
        </ResponseField>

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

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

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

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

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

        <ResponseField name="Compression" type="drop-down" required>
          Select the compression method if you wish to compress your data. If you do not wish to compress at all, select NONE. The default setting is AUTO.
        </ResponseField>

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

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

        <ResponseField name="Nest columns" type="drop-down" required>
          When **Yes**, 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 Yes. The default setting is **No**.
        </ResponseField>

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

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

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

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

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

        <ResponseField name="Trim space" type="boolean" required>
          When **Yes**, removes whitespace from fields. Default setting is **No**.
        </ResponseField>

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

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

        <ResponseField name="Compression" type="drop-down" required>
          Select the compression method if you wish to compress your data. If you do not wish to compress at all, select NONE. The default setting is AUTO.
        </ResponseField>

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

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

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

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

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

        <ResponseField name="Trim space" type="boolean" required>
          When **Yes**, removes whitespace from fields. Default setting is **No**.
        </ResponseField>

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

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

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

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

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

    <ResponseField name="Single file" type="drop-down" required>
      When **Yes**, 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 **No**.

      When **Yes**, no file extension is used in the output filename (regardless of the file type, and regardless of whether the file is compressed). When **No**, a filename prefix must be included in the path.
    </ResponseField>

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

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

    <ResponseField name="Max file size" type="integer" required>
      A number, greater than 0, that specifies the upper size limit (in bytes) of each file to be generated in parallel per thread.

      The actual file size and number of files unloaded are determined by the total amount of data and number of nodes available for parallel processing.
    </ResponseField>

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

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

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

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

  <Tab title="Google BigQuery">
    {/* <!-- param-start:[googleStorageURLLocation] | warehouses: [bigquery] --> */}

    <ResponseField name="Google Storage URL location" type="file explorer" required>
      The Cloud Storage folder (a `gs://` path) the files are written to. The picker is restricted to selecting a folder.
    </ResponseField>

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

    {/* <!-- param-start:[outputObjectName] | warehouses: [bigquery] --> */}

    <ResponseField name="Output object name" type="string" required>
      The name (or sub-path) of the object created within the destination folder. This value is appended to the folder location to form the full destination URI.

      BigQuery can export up to 1 GB to a single file. To export more than 1 GB, the object name must contain exactly one wildcard (`*`). BigQuery shards the export across multiple files, and replaces the wildcard with a sequence number starting at 0 and left-padded to 12 digits (for example, `000000000000`, `000000000001`). If the export exceeds 1 GB and no wildcard is included, the export fails.

      Examples:

      * `export.csv` — object name only.
      * `reports/export.csv` — object name within a sub-path.
      * `reports/export-*.csv` — sharded export using a wildcard.
    </ResponseField>

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

    {/* <!-- param-start:[project] | warehouses: [bigquery] --> */}

    <ResponseField name="GCP project ID" type="drop-down" required>
      The Google Cloud project that owns the BigQuery dataset. The special value `[Environment Default]` uses the Google Cloud project defined in the environment. For more information, read [Creating projects](https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects).
    </ResponseField>

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

    {/* <!-- param-start:[dataset] | warehouses: [bigquery] --> */}

    <ResponseField name="Dataset" type="drop-down" required>
      The Google BigQuery dataset containing the table to unload. Defaults to the dataset configured in the environment.
    </ResponseField>

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

    {/* <!-- param-start:[table] | warehouses: [bigquery] --> */}

    <ResponseField name="Target table" type="drop-down" required>
      Choose the Google BigQuery table or view containing the data to export.
    </ResponseField>

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

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

    <ResponseField name="File type" type="drop-down" required>
      The format of the exported files. One of: CSV, JSON (New line delimited), Parquet, or Avro.

      Component properties will change to reflect the selected file type. Click one of the tabs below for properties applicable to that file type.
    </ResponseField>

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

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

        <ResponseField name="Compression" type="drop-down" required>
          Compression applied to the output files. Select **NONE** or **GZIP**. Defaults to NONE.
        </ResponseField>

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

        {/* <!-- param-start:[fieldDelimiter] | warehouses: [bigquery] --> */}

        <ResponseField name="Field delimiter" type="string">
          The character used to separate fields within each row. Defaults to a comma (`,`).
        </ResponseField>

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

        {/* <!-- param-start:[includeHeaders] | warehouses: [bigquery] --> */}

        <ResponseField name="Include headers" type="drop-down">
          Whether to write a header row of column names as the first line of each file. Defaults to **No**.
        </ResponseField>

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

      <Tab title="JSON (New line delimited)">
        {/* <!-- param-start:[compression] | warehouses: [bigquery] --> */}

        <ResponseField name="Compression" type="drop-down" required>
          Compression applied to the output files. Select **NONE** or **GZIP**. Defaults to NONE.
        </ResponseField>

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

      <Tab title="Parquet">
        {/* <!-- param-start:[compression] | warehouses: [bigquery] --> */}

        <ResponseField name="Compression" type="drop-down" required>
          Compression applied to the output files. Select **NONE**, **SNAPPY**, or **GZIP**. Defaults to NONE.
        </ResponseField>

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

      <Tab title="Avro">
        {/* <!-- param-start:[compression] | warehouses: [bigquery] --> */}

        <ResponseField name="Compression" type="drop-down" required>
          Compression applied to the output files. Select **NONE**, **DEFLATE**, or **SNAPPY**. Defaults to NONE.
        </ResponseField>

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