Google bigquery 如何列出项目中的所有表格大小
有没有办法在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
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;