BigQuery: как установить `require_partition_filter` с помощью TableReference - PullRequest
0 голосов
/ 08 января 2020

Я собираюсь установить require_partition_filter в True для bigquery Таблица . Но я могу получить доступ только к TableReference вместо Table. Как это сделать?

ОБНОВЛЕНИЕ

Возможно, я не express четко сформулировал свой вопрос. Мне нужно написать python программу , чтобы сделать это. Я не хотел бы устанавливать конфигурацию с помощью команд или sql, потому что таблиц слишком много. В этой программе я могу сгенерировать TableReference table_ref в следующей программе. Но как установить require_parition_filter на table_ref?

    def table(client, dataset_name, table_name):
        dataset = client.dataset(dataset_name)
        table_ref = dataset.table(table_name)
        return table_ref

    job = client.load_table_from_uri(
        glob, # google cloud storage bucket
        table_ref, # returned by table() function above
        job_id='123',
        job_config=config, # at beginning, set `require_parition_filter` here, but this deprecated
   )

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Как это сделать?

Как уже упоминалось в этом ответе , вы можете использовать команду ALTER , чтобы изменить таблицу следующим образом:

#standardSQL
ALTER TABLE IF EXISTS mydataset.newtable
SET OPTIONS(
    require_partition_filter = false
)

Вы можете изменить require_partition_filter обратно на true, если необходимо, используя ту же команду

0 голосов
/ 09 января 2020

Обратите внимание, что предпочтительным способом было бы получить объект bigquery.Table из TableReference, изменить require_partition_filter и исправить таблицу (аналогично пример с датой истечения срока действия). Однако, как вы упоминаете, что вы можете получить доступ только к TableReference, вы также можете установить TimePartitioning.require_partition_filter ( устарело в соответствии с документами) при создании таблицы с заданием загрузки. Например:

job_config = bigquery.LoadJobConfig(
    schema = [
        bigquery.SchemaField("foo", "STRING"),
    ],
    time_partitioning = bigquery.TimePartitioning(
        type_=bigquery.TimePartitioningType.DAY,
        require_partition_filter = True
    )    
)

и работает как положено:

$ bq query "SELECT * FROM test.require_filter"
Waiting on JOB_ID ... (0s) Current status: DONE   
Error in query string: Error processing job 'JOB_ID': Cannot query over table 'test.require_filter' without a filter over column(s) '_PARTITION_LOAD_TIME',
'_PARTITIONDATE', '_PARTITIONTIME' that can be used for partition elimination

Полный код:

import pandas as pd
from google.cloud import bigquery


PROJECT = "PROJECT_ID"
DATASET = "test"
TABLE = "require_filter"


def table(client, dataset_name, table_name):
    dataset = client.dataset(dataset_name)
    table_ref = dataset.table(table_name)
    return table_ref


client = bigquery.Client(project=PROJECT)

job_config = bigquery.LoadJobConfig(
    schema = [
        bigquery.SchemaField("foo", "STRING"),
    ],
    time_partitioning = bigquery.TimePartitioning(
        type_=bigquery.TimePartitioningType.DAY,
        require_partition_filter = True
    )    
)

data = {"foo": ["bar"]}
df = pd.DataFrame(data)

table_ref = table(client, DATASET, TABLE)

load_job = client.load_table_from_dataframe(
    df, 
    table_ref,
    job_config = job_config
)

result = load_job.result()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...