【问题标题】:How to drop multiple tables in Big query using Wildcards TABLE_DATE_RANGE()?如何使用通配符 TABLE_DATE_RANGE() 在大查询中删除多个表?
【发布时间】:2018-01-07 23:44:23
【问题描述】:

我正在查看文档,但没有找到使用通配符删除多个表的方法。

我试图做这样的事情,但它不起作用:

DROP TABLE
 TABLE_DATE_RANGE([clients.sessions_], 
                  TIMESTAMP('2017-01-01'), 
                  TIMESTAMP('2017-05-31'))

【问题讨论】:

    标签: sql google-bigquery google-cloud-platform


    【解决方案1】:

    对于数据集 stats 和像 daily_table_20181017 这样的表保持日期约定,我会使用简单的脚本和 gcloud 命令行工具:

    for table in `bq ls --max_results=10000000 stats |grep TABLE |grep daily_table |awk '{print $1}'`; do echo stats.$table; bq rm -f -t stats.$table; done
    

    【讨论】:

    • 在新的gcloud alpha bq 界面中,您可以执行tables=$(gcloud --format='table[no-heading](TABLE_ID)' --project=$project alpha bq tables list --dataset=$dataset); for table in $tables; do gcloud --project=$project alpha bq tables delete $table --dataset=$dataset; done 如果bq 界面停止工作,这很有用,就像它对我所做的那样......
    【解决方案2】:

    DDL 例如DROP TABLE 在 BigQuery 中尚不存在。不过,我知道 Google 目前正在努力。

    与此同时,您需要使用 API 来删除表。例如,使用 gCloud 工具:

    bq rm -f -t dataset.table
    

    如果您想进行批量删除,那么您可以使用一些 bash/awk 魔法。或者,如果您愿意,可以直接调用 Rest API,例如Python client

    也见here

    【讨论】:

    【解决方案3】:

    我只是使用 python 循环这个并使用 Graham 示例解决它:

     from subprocess import call
    
    
       return_code = call('bq  rm -f -t dataset.' + table_name +'_'+  period + '', shell=True)
    

    【讨论】:

    • 我不建议这样做。最好还是继续使用 bash,或者使用 Python。
    • 嗯,这有点棘手,因为我必须循环某些日期并从 CSV 读取一些信息。我只是需要它来快速修复。仅使用 python 库我无法使其工作。但你是对的。我会更好地使用其中一个。干杯
    【解决方案4】:

    很长一段时间以来,@graham 的方法都对我有用。就在最近,每次我运行上述命令时,BQ CLI 都会停止有效工作并冻结。因此,我挖掘了一种新方法并使用了谷歌云官方文档的某些部分。我使用 Jupyter notebook 遵循了以下方法。

    from google.cloud import bigquery
    
    # TODO(developer): Construct a BigQuery client object.
    client = bigquery.Client.from_service_account_json('/folder/my_service_account_credentials.json')
    
    dataset_id = 'project_id.dataset_id'
    dataset = client.get_dataset(dataset_id)
    
    # Creating a list of all tables in the above dataset
    tables = list(client.list_tables(dataset))  # API request(s)
    
    
    ## Filtering out relevant wildcard tables to be deleted
    ## Mention a substring that's common in all your tables that you want to delete
    
    tables_to_delete = ["{}.{}.{}".format(dataset.project, dataset.dataset_id, table.table_id) 
                        for table in tables if "search_sequence_" in format(table.table_id)]
    
    for table in tables_to_delete:
        client.delete_table(table)
        print("Deleted table {}".format(table))  ```
    

    【讨论】:

      【解决方案5】:

      删除表 [table_name];现在在 bigquery 中得到支持。所以这里是一个纯粹的 SQL/bigquery UI 解决方案。

      select concat("drop table ",table_schema,".",   table_name, ";" )
      from <dataset-name>.backerkit_production_follower.INFORMATION_SCHEMA.TABLES
      where table_name like "partial_table_name%"
      order by table_name desc
      

      审核您正在删除正确的表。复制并粘贴回 bigquery 以删除列出的表。

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多