如何列出项目中所有表格的大小

时间:2018-10-18 09:07:24

标签: google-bigquery

有没有办法列出BigQuery中所有表的大小?

我知道这样的命令:

select 
  table_id,
  sum(size_bytes)/pow(10,9) as size
from
  certain_dataset.__TABLES__
group by 
  1

但是我想知道所有数据集中的所有表。

谢谢

4 个答案:

答案 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 字节