我正在查看文档,但我还没有找到使用通配符删除多个表的方法。
我试图做这样的事情,但它不起作用:
DROP TABLE
TABLE_DATE_RANGE([clients.sessions_],
TIMESTAMP('2017-01-01'),
TIMESTAMP('2017-05-31'))
对于数据集
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
删除表[表名]; 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 以删除列出的表。
DDL 例如BigQuery 中尚不存在
DROP TABLE
。不过,我知道谷歌目前正在努力。
与此同时,您需要使用 API 来删除表。例如,使用 gCloud 工具:
bq rm -f -t dataset.table
如果你想进行批量删除,那么你可以使用一些 bash/awk 魔法。或者,如果您愿意,可以直接调用 Rest API,例如Python 客户端。
也请参阅此处。
有了可用的脚本和表信息模式,以下内容也可以直接在 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;
我只是使用 python 来循环这个问题并使用 Graham 示例解决它:
from subprocess import call
return_code = call('bq rm -f -t dataset.' + table_name +'_'+ period + '', shell=True)
很长一段时间以来,@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)) ```
以@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 条件。
基于Dengar的answer和Paul的回复,我使用了另一种解决方案。这也解释了表和视图。
警告: 生成的命令将删除给定数据集中的 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
)
;