【发布时间】:2021-03-31 23:54:10
【问题描述】:
在 BigQuery 中,对于查询,我收到以下错误消息:
无法查询大于 100MB 限制的行。
我了解限制,但是,我想对此进行更多调试并搜索大于 100MB 的行。
是否有人知道 BigQuery 中的函数是否存在(或者是否有其他方法)来获取表中每一行的大小?
【问题讨论】:
标签: google-bigquery
在 BigQuery 中,对于查询,我收到以下错误消息:
无法查询大于 100MB 限制的行。
我了解限制,但是,我想对此进行更多调试并搜索大于 100MB 的行。
是否有人知道 BigQuery 中的函数是否存在(或者是否有其他方法)来获取表中每一行的大小?
【问题讨论】:
标签: google-bigquery
行的大小由各个值的数据类型定义。您可以添加静态列(例如数字)并使用函数添加动态大小的数据(例如字符串)的大小。
在列的子集上执行此操作(我假设当行因 JOIN 而变大时会出现错误),然后您可以找到异常大的行并相应地处理它们。
数据类型大小
Data type Size INT64/INTEGER 8 bytes FLOAT64/FLOAT 8 bytes NUMERIC 16 bytes BIGNUMERIC (Preview) 32 bytes BOOL/BOOLEAN 1 byte STRING 2 bytes + the UTF-8 encoded string size BYTES 2 bytes + the number of bytes in the value DATE 8 bytes DATETIME 8 bytes TIME 8 bytes TIMESTAMP 8 bytes STRUCT/RECORD 0 bytes + the size of the contained fields GEOGRAPHY 16 bytes + 24 bytes * the number of vertices in the geography type (you can verify the number of vertices using the ST_NumPoints function)任何数据类型的 Null 值都计算为 0 字节。
将重复的列存储为数组,并根据值的数量计算大小。例如,重复 (ARRAY) 并包含 4 个条目的整数列 (INT64) 计算为 32 个字节(4 个条目 x 8 个字节)。
来源:Data size calculation - BigQuery Documentation
类似问题:How many bytes in BigQuery types (StackOverflow)
示例
当您有 2 个字符串列、1 个数字列和 1 个日期时间列时的示例:
SELECT 2 + BYTE_LENGTH(string_column1)
+ 2 + BYTE_LENGTH(string_column2)
+ 16 -- NUMERIC -> 16 Bytes
+ 8 -- DATETIME -> 8 Bytes
AS ROW_SIZE
FROM `project-name.dataset-name.table-name`
【讨论】:
我认为没有现成的解决方案(例如 BQ 中的函数)。
我经常做和帮助的是使用数据集的 __TABLES__ 元数据表,以便估计表的每行平均大小
所以,我的查询应该是这样的
SELECT
table_id,
(size_bytes/row_count) / 1000000 as row_size -- avg row size in MB
FROM `my_dataset.my_table.__TABLES__`
【讨论】: