Loading externally partitioned data

BigQuery can load data that is stored in Cloud Storage using a hive partitioning layout. Hive partitioning means that the external data is organized into multiple files, with a naming convention to separate files into different partitions. For more information, see Supported data layouts on this page.


  • Hive partitioning support is built assuming a common source URI prefix for all URIs that ends immediately before partition encoding, which looks like gs://<bucket>/<path_to_table>/.
  • The directory structure of a hive partitioned table is assumed to have the same partitioning keys appear in the same order, with a maximum of ten partition keys per table.
  • The data must follow a default hive partitioning layout.
  • The hive partitioning keys and the columns in the underlying files cannot overlap.
  • All limitations for loading from Cloud Storage apply.

Supported data layouts

The data must follow a default hive partitioned layout. For instance, the following files follow the default layout, with the key/value pairs laid out as directories with an = sign as a separator, and the partition keys are always in the same order.


The common source URI prefix in this example is gs://bucket/table.

Unsupported data layouts

If the partition key names are not encoded in the directory path, partition schema detection will fail. For example, consider the following path, which does not encode the partition key names:


Files where the schema is not in a consistent order also fail detection. For example, consider the following two files with inverted partition key encodings:


Partition schema detection modes

Hive partition keys appear as normal columns when loading data from Cloud Storage. We support three modes of hive partition schema detection:

  • AUTO: Key names and types are auto detected. The following types can be detected: STRING, INTEGER, DATE and TIMESTAMP.
  • STRINGS: Key names are automatically inferred with STRING type.
  • CUSTOM: Partition key schema is encoded in the source URI prefix.

Providing a custom partition key schema

CUSTOM detection requires encoding the schema in the source URI prefix field by providing partition key name/type pairs. The values must validly parse as the specified type or the load fails.

For example, setting source_uri_prefix to: gs://my_bucket/my_table/{dt:DATE}/{val:STRING} treats val as a STRING and dt as a DATE, and extracting gs://my_bucket/my_table as the source URI prefix for the matched files.

See detailed instructions for the Cloud Console, bq command-line tool, and REST API.

Performing incremental loads

Consider the following data layout:


To load only data from 2019-10-31:

  • Set the hive partitioning mode to AUTO, STRINGS, or CUSTOM
  • Set the source URI prefix to gs://my_bucket/my_table/ for AUTO or STRINGS hive partitioning modes. For CUSTOM, provide gs://my_bucket/my_table/{dt:DATE}/{val:INTEGER}.
  • Use the URI gs://my_bucket/my_table/dt=2019-10-31/*
  • Data is loaded with dt and val columns included, with values 2019-10-31 and 1, respectively.

To load only data from specific files:

  • Set the hive partitioning mode to AUTO, STRINGS, or CUSTOM
  • Set the source URI prefix to gs://my_bucket/my_table/ for AUTO or STRINGS hive partitioning modes. For CUSTOM, provide gs://my_bucket/my_table/{dt:DATE}/{val:INTEGER}.
  • Use the URIs gs://my_bucket/my_table/dt=2017-10-31/val=3/file3,gs://my_bucket/my_table/dt=2016-10-31/val=4/file4
  • Data is loaded from both files with the dt and val columns filled in.

Setting HivePartitioningOptions using the Cloud Console

To set hive partitioning options in the Cloud Console, do the following steps:

  1. Open the BigQuery page in the Cloud Console.

    Go to the BigQuery page

  2. In the Explorer panel, expand your project and select a dataset.

  3. Expand the Actions option and click Open.

  4. In the details panel, click Create table .

  5. Select Cloud Storage from the Create table from drop-down.

    Hive Partitioning Options

  6. In the Select file from Cloud Storage bucket field, enter your dataset's file path, then select its file type from the drop-down.

    1. Check the Source data partitioning box, then enter the source URI prefix in the provided field.
    2. Under Partition inference mode, choose "Automatically infer types" for AUTO or "All columns are strings" for STRINGS.
    3. Choose "Native table" from the Table type drop-down.

Setting HivePartitioningOptions using the bq command-line tool

Requesting automatic partition key type detection

bq load --source_format=ORC --hive_partitioning_mode=AUTO \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
dataset.table gcs_uris 

Requesting string-typed partition key detection

bq load --source_format=PARQUET --autodetect \
--hive_partitioning_mode=STRINGS \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
dataset.table gcs_uris

Providing a custom partition key schema encoded via the source_uri_prefix field

bq load --source_format=JSON --hive_partitioning_mode=CUSTOM \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/custom_schema_encoding \
dataset.table gcs_uris file_schema

The partition key schema is encoded immediately following the source URI prefix. Use the following format to specify --hive_partitioning_source_uri_prefix:


Setting HivePartitioningOptions using the REST API

Support for hive partitioning exists by setting the HivePartitioningOptions on the JobConfigurationLoad.

Note that when hivePartitioningOptions.mode is set to CUSTOM, you must encode the partition key schema within the sourceUriPrefix by setting hivePartitioningOptions.sourceUriPrefix to gs://bucket/path_to_table/{key1:TYPE1}/{key2:TYPE2}/{key3:TYPE3}.