BigQuery supports clustering for both partitioned and non-partitioned tables.

Reference: [https://cloud.google.com/bigquery/docs/clustered-tables](https://cloud.google.com/bigquery/docs/clustered-tables)
airflow/providers/google/cloud/hooks/bigquery.py
https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#Table
            The table has to contain ``tableReference`` or ``project_id``, ``datset_id`` and ``table_id``
            have to be provided.
        :type table_resource: Dict[str, Any]
        :param fields: The fields of ``table`` to change, spelled as the Table
            properties (e.g. "friendly_name").
        :type fields: List[str]
        """
        fields = fields or list(table_resource.keys())
        table_resource = self._resolve_table_reference(
            table_resource=table_resource, project_id=project_id, dataset_id=dataset_id, table_id=table_id
        )
        table = Table.from_api_repr(table_resource)
        self.log.info('Updating table: %s', table_resource["tableReference"])
        table_object = self.get_client().update_table(table=table, fields=fields)
        self.log.info('Table %s.%s.%s updated successfully', project_id, dataset_id, table_id)
        return table_object.to_api_repr()
    @GoogleBaseHook.fallback_to_default_project_id
    def patch_table(  # 
        self,
        dataset_id: str,
        table_id: str,
        project_id: Optional[str] = None,
        description: Optional[str] = None,
        expiration_time: Optional[int] = None,
        external_data_configuration: Optional[Dict] = None,
        friendly_name: Optional[str] = None,
        labels: Optional[Dict] = None,
        schema: Optional[List] = None,
        time_partitioning: Optional[Dict] = None,