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

Google bigquery 如何列出项目中的所有表格大小,google-bigquery,Google Bigquery,有没有办法在BigQuery中列出所有表的大小 我知道这样的命令: select table_id, sum(size_bytes)/pow(10,9) as size from certain_dataset.__TABLES__ group by 1 但我想知道所有数据集中的所有表 谢谢目前,在单个查询中无法实现这一点,但您可以使用脚本来实现,下面是我的python脚本,用于打印列表: 从google.cloud导入bigquery client=bigquery.cl

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

我知道这样的命令:

select 
  table_id,
  sum(size_bytes)/pow(10,9) as size
from
  certain_dataset.__TABLES__
group by 
  1
但我想知道所有数据集中的所有表


谢谢

目前,在单个查询中无法实现这一点,但您可以使用脚本来实现,下面是我的python脚本,用于打印列表:

从google.cloud导入bigquery client=bigquery.client 数据集=listclient.list\u数据集 project=client.project 如果数据集: 打印“项目{}中的数据集:”。formatproject 对于数据集中的数据集:API请求 打印“数据集:{}”.formatdataset.Dataset\u id query\u job=client.query从`+dataset.dataset\u id+`.\uu TABLES\uuuuu按1分组,选择表\u id,sumsize\u字节/pow10,9作为大小 results=query\u job.result 对于结果中的行: 打印\t表:{}:{}.formatrow.table\u id,row.size 其他: 打印{}项目不包含任何数据集。formatproject
如果您想要一个python脚本来抓取所有表并捕获所有元数据,如列类型、表大小、描述等,我的github帐户上有一个脚本可以完成这项工作

它会根据需要将输出保存到Bigquery表、CSV或JSON中

我为一个客户创建了这个,他必须审核成千上万个表,但我使用它在公共数据集中查找特定的表功能


随着2020年在BigQuery脚本中引入动态SQL,这个问题变得更容易了。现在,我们可以动态构建查询,并通过executeimmediate执行它

在所有数据集都位于美国地区的大多数情况下,这样做是可行的:

如果存在大量数据集,那么在尝试同时读取所有元数据时,可能会返回速率限制错误

如果发生这种情况,那么我们可以采用批处理方法,这种方法的读取稍微复杂一些,速度较慢/效率较低,但仍然可以完成工作:

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;

你好,亚历克斯。如何提供此代码的凭据?当我点击这一行“client=bigquery.client”时,我得到一条消息,“DefaultCredentialsError:无法自动确定凭据”。请设置GOOGLE_应用程序_凭据或显式创建凭据并重新运行应用程序。有关更多信息,请参阅。谢谢。哦,我知道它是如何工作的。您创建一个.json文件并如下引用它:client=bigquery.client.from_service_account_json'C:/your_path_here.123456789.json'
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;