如何使用通配符 TABLE_DATE_RANGE() 在大查询中删除多个表?

问题描述 投票:0回答:8

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

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

DROP TABLE
 TABLE_DATE_RANGE([clients.sessions_], 
                  TIMESTAMP('2017-01-01'), 
                  TIMESTAMP('2017-05-31'))
sql google-bigquery google-cloud-platform
8个回答
12
投票

对于数据集

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

9
投票

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

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

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


5
投票

DDL 例如BigQuery 中尚不存在

DROP TABLE
。不过,我知道谷歌目前正在努力。

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

bq rm -f -t dataset.table

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

也请参阅此处


3
投票

有了可用的脚本和表信息模式,以下内容也可以直接在 UI 中使用。

我不建议使用此方法删除大量表。

FOR tn IN (SELECT table_name FROM yourDataset.INFORMATION_SCHEMA.TABLES WHERE table_name LIKE "filter%")
DO
  EXECUTE IMMEDIATE FORMAT("DROP TABLE `yourDataset.%s`", tn.table_name);
END FOR;

1
投票

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

 from subprocess import call


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

1
投票

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

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))  ```

1
投票

以@Dengar 的答案为基础。 您可以在 BigQuery 中使用过程 SQL 在 for 循环中运行所有这些删除语句,如下所示:

FOR record IN (
  select concat(
  "drop table ",
  table_schema,".",   table_name, ";" ) as del_stmt
from <dataset_name>.INFORMATION_SCHEMA.TABLES
order by table_name) DO
  -- create the views
EXECUTE IMMEDIATE
  FORMAT( """
    %s
    """, record.del_stmt);
END
  FOR;

如果不想删除数据集中的所有表,请添加 WHERE 条件。


0
投票

基于DengaranswerPaul的回复,我使用了另一种解决方案。这也解释了表和视图。

警告: 生成的命令将删除给定数据集中的 ALL 表和视图。那是我的用例。

SELECT
    ARRAY_TO_STRING(ARRAY_AGG( sqls), "; " )
FROM (
        SELECT
            CONCAT("DROP ", ARRAY_REVERSE(SPLIT(table_type, ' '))[OFFSET(0)], " ", table_schema,".", table_name) AS sqls
        FROM <DATASET-NAME>.INFORMATION_SCHEMA.TABLES ORDER BY table_name DESC
     )
;
© www.soinside.com 2019 - 2024. All rights reserved.