有没有办法列出BigQuery中所有表的大小?
我知道这样的命令:
select
table_id,
sum(size_bytes)/pow(10,9) as size
from
certain_dataset.__TABLES__
group by
1
但是我想知道所有数据集中的所有表。
谢谢
答案 0 :(得分:4)
目前无法在单个查询中执行此操作,但是您可以使用脚本来执行此操作,这是我的python脚本:
UseShellExecute = false,
//UserName = "User1",
//Password = "Password1".ToSecureString(),
//Domain = "Machine-Name",
Verb = "runas"
答案 1 :(得分:1)
随着 2020 年将动态 SQL 引入 BigQuery 脚本,这个问题变得稍微容易一些。现在,我们可以动态构建查询并通过 EXECUTE IMMEDIATE
执行它。
对于所有数据集都在 region-us
中的大多数情况,这样的操作都适用:
DECLARE dataset_names ARRAY<STRING>;
SET dataset_names = (
SELECT ARRAY_AGG(SCHEMA_NAME) FROM `region-us.INFORMATION_SCHEMA.SCHEMATA`
);
EXECUTE IMMEDIATE (
SELECT STRING_AGG(
(SELECT """
SELECT project_id, dataset_id, table_id, row_count, size_bytes
FROM `""" || s ||
""".__TABLES__`"""),
" UNION ALL ")
FROM UNNEST(dataset_names) AS s);
如果有大量数据集,那么在尝试同时读取所有元数据时可能会返回速率限制错误。
如果发生这种情况,那么我们可以退回到“批处理”方法,该方法读取起来更复杂,速度更慢/效率更低,但仍然可以完成工作:
DECLARE dataset_names ARRAY<STRING>;
DECLARE batch ARRAY<STRING>;
DECLARE batch_size INT64 DEFAULT 25;
CREATE TEMP TABLE results (
project_id STRING,
dataset_id STRING,
table_id STRING,
row_count INT64,
size_bytes INT64
);
SET dataset_names = (
SELECT ARRAY_AGG(SCHEMA_NAME)
FROM `region-us.INFORMATION_SCHEMA.SCHEMATA`
);
LOOP
IF ARRAY_LENGTH(dataset_names) < 1 THEN
LEAVE;
END IF;
SET batch = (
SELECT ARRAY_AGG(d)
FROM UNNEST(dataset_names) AS d WITH OFFSET i
WHERE i < batch_size);
EXECUTE IMMEDIATE (
SELECT """INSERT INTO results """
|| STRING_AGG(
(SELECT """
SELECT project_id, dataset_id, table_id, row_count, size_bytes
FROM `""" || s || """.__TABLES__`"""),
" UNION ALL ")
FROM UNNEST(batch) AS s);
SET dataset_names = (
SELECT ARRAY_AGG(d)
FROM UNNEST(dataset_names) AS d
WHERE d NOT IN (SELECT * FROM UNNEST(batch)));
END LOOP;
SELECT * FROM results;
答案 2 :(得分:0)
如果您想要一个能够抓取所有表格并捕获所有元数据(例如列类型、表格大小、描述等)的 Python 脚本,我的 github 帐户中有一个脚本可以执行此操作。
它会根据您的需要将输出保存到 Bigquery 表、CSV 或 JSON。
我为一位必须审计数以万计的表的客户创建了这个,但我用来在公共数据集中查找特定的表特征。
https://github.com/go-dustin/gcp_data_utilities/tree/master/BigQuery/meta_data_crawler
答案 3 :(得分:0)
from google.cloud import bigquery
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "YOURGCPSERVICEACCOUNTKEY.json"
GCP_PROJECT_ID = "YOURGCPPROJECT"
client = bigquery.Client(project=GCP_PROJECT_ID)
datasets = list(client.list_datasets())
project = client.project
if datasets:
print('Datasets in project {}:'.format(project))
for dataset in datasets: # API request(s)
print('Dataset: {}'.format(dataset.dataset_id))
query_job = client.query(
f"""
SELECT
table_id,
size_bytes/pow(1024,3) AS size_GB,
FROM `{GCP_PROJECT_ID}.{dataset.dataset_id}`.__TABLES__
"""
)
results = query_job.result()
for row in results:
print(f"\tTable: {row.table_id} : {row.size_GB} GB")
else:
print('project does not contain any datasets.'.format(project))
在@Alex 的回答上回复,此回答将获得更准确的 GB 大小数字。 1kb 应该表示为 1024 字节