Skip to main content
Exports the results of a SELECT query to Amazon S3 in your specified file format. You can specify the output file format, compression type, and other options to control how the data is written, such as file name conventions and whether to overwrite existing files. Use COPY TO for backing up query results or integrating Firebolt with other data processing tools.

Syntax

The WITH keyword before the options list is optional. Additionally, you can use either = or a space to separate option names from their values. For example, both TYPE = JSON and TYPE JSON are valid.

Parameters

For TYPE = PARQUET, Firebolt ends a row group at whichever comes first: 1,000,000 rows, or 33,554,432 bytes (32 MiB) of data. The row count is a limit that no row group exceeds; the byte figure is a target that a row group can overshoot, and it counts the data before compression, so row groups in the exported file are smaller than 32 MiB. Larger row groups let a reader skip more of a file at once, which is why row group size affects how efficiently the exported files can be queried later. Firebolt only starts a new file at a row group boundary, so a file can exceed MAX_FILE_SIZE by up to the size of the last row group it wrote, and the final file from each writer contains only the remaining rows and can be much smaller.

Credentials

Firebolt needs permissions to write query results to the specified Amazon S3 URL. You can specify IAM credentials using the AWS access keys, and the specified credentials must be associated with a user with permissions to write objects to the bucket.

Credentials for Amazon S3

Specify access key credentials using the syntax shown below.
For Amazon S3 locations, you can use either access key-based authentication or role-based authentication:
For role-based AWS access you can additionally set an external ID. An external ID is a value you choose and control that AWS checks when Firebolt assumes your role, adding a second condition on top of your account’s unique IAM principal. Configuring one is a recommended best practice. See IAM roles.
For more information on how to create access keys, see Creating Access Key and Secret ID.

Credentials for Google Cloud Storage

A gs:// destination supports two credential modes: Whether the engine-identity mode is available depends on the deployment. Where it sets storage.gcp.intermediary_service_account_id, that service account is the principal, so the mode is available whatever storage.gcp.allow_engine_identity says: that setting governs only the engine’s own identity. Where it sets none, the engine authenticates as its own Google identity, which the deployment permits with storage.gcp.allow_engine_identity = true. The Firebolt Operator and the Helm chart enable it by default for the engines they deploy, so a self-managed engine on Kubernetes has it. A standalone engine has it once you enable it. On the Firebolt managed service the engine’s Google identity belongs to Firebolt rather than to your account, so the mode is not available there. When the mode is not available, a gs:// destination without CREDENTIALS fails with an error that asks for an HMAC key. Both modes need storage.objects.list, because Firebolt lists the destination prefix to confirm the bucket is reachable before it exports anything, and storage.objects.create. With OVERWRITE_EXISTING_FILES = FALSE they also need storage.objects.get, because Firebolt reads each destination object’s metadata to confirm that the object does not already exist. With OVERWRITE_EXISTING_FILES = TRUE they need storage.objects.delete instead, because Google Cloud Storage counts replacing an existing object as a delete. On top of that:
  • HMAC key. An object that outgrows a single 5 MiB upload part is written through the XML API’s multipart upload, which additionally needs storage.multipartUploads.create, storage.multipartUploads.abort, and storage.multipartUploads.listParts. The default MAX_FILE_SIZE is far above one part, so grant these unless every exported object is small enough for a single request.
  • Engine identity. The gRPC API writes each object in one resumable session, whatever its size, so no multipart permissions apply.
MAX_FILE_SIZE applies to a gs:// destination exactly as it does to s3://, and the 50,000 MiB ceiling described in its row above binds the HMAC-key mode only. AWS_SESSION_TOKEN and AWS_ROLE_ARN are rejected for gs:// destinations.

Least privileged permissions

The example AWS IAM policy statement below demonstrates the minimum actions that must be allowed for Firebolt to write query files to an example Amazon S3 URL. A permissions policy that allows at least these actions for the <s3_url> that you specify in the COPY TO statement must be attached to the user or role specified in the CREDENTIALS clause.

Using Location Objects

Location objects provide a secure and reusable way to specify Amazon S3 destinations for your data exports. This is the recommended approach as it:
  • Centralizes credential management
  • Eliminates the need to specify credentials in each COPY statement
  • Provides better security through role-based access control
  • Simplifies maintenance and updates
For a comprehensive guide to LOCATION objects, see LOCATION objects. For complete syntax reference, see CREATE LOCATION.

Example with Location Object

The location object my_export_location contains the Amazon S3 URL and credentials, making the statement cleaner and more secure.

Examples

COPY TO with location object

This example demonstrates the recommended approach using a location object. The location object contains the Amazon S3 URL and credentials, making the statement more secure and maintainable.
Firebolt writes a single file as shown below.

COPY TO with defaults and role ARN

The example below shows a COPY TO statement with minimal parameters that specifies an AWS_ROLE_ARN together with a recommended AWS_ROLE_EXTERNAL_ID. Because TYPE is omitted, the file or files will be written in CSV format, and because COMPRESSION is omitted, they are compressed using GZIP (*.csv.gz).
AWS_ROLE_EXTERNAL_ID is optional; omit it to assume the role without an external ID. Firebolt assigns a UUID formatted query ID, to the query at runtime. The compressed output is 500 MB, exceeding the default MAX_FILE_SIZE of 128 MiB, so Firebolt writes 4 files as shown below.

COPY TO with single file and AWS access keys

The example below exports a single, uncompressed JSON file with the same name as the query ID. If the file to be written exceeds the specified MAX_FILE_SIZE (5 GB), an error occurs. AWS access keys are specified for credentials.
Firebolt writes a single file as shown below.

COPY TO with custom file name prefix and ARN with external ID

In the example below, because FILE_NAME_PREFIX parameter is specified, Firebolt adds a string to the query ID to form file names. The IAM role specified for CREDENTIALS also has an external ID configured in AWS, so the ID is specified.
Firebolt assigns the query an id of 16B90E96716236D6 at runtime and writes files as shown below.

COPY TO with custom file name and overwrite set to TRUE

In the example below, INCLUDE_QUERY_ID_IN_FILE_NAME is set to FALSE and a FILE_NAME_PREFIX is specified. In this case, Firebolt writes files using only the specified FILE_NAME_PREFIX as the file name. In addition, SINGLE_FILE and OVERWRITE_EXISTING_FILES are set to TRUE so that the Amazon S3 URL always contains a single file with the latest query results.
Firebolt writes a single file as shown below.