【问题标题】:BigQuery: Get size of each row in tableBigQuery:获取表中每一行的大小
【发布时间】:2021-03-31 23:54:10
【问题描述】:

在 BigQuery 中,对于查询,我收到以下错误消息:

无法查询大于 100MB 限制的行。

我了解限制,但是,我想对此进行更多调试并搜索大于 100MB 的行。

是否有人知道 BigQuery 中的函数是否存在(或者是否有其他方法)来获取表中每一行的大小?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    行的大小由各个值的数据类型定义。您可以添加静态列(例如数字)并使用函数添加动态大小的数据(例如字符串)的大小。

    在列的子集上执行此操作(我假设当行因 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`
    

    来源:String Byte Length Calculation

    【讨论】:

    • 完美,非常感谢!实际上,我使用的 ARRAY_AGG() 函数将许多行合并在一起,超出了行数限制。
    • @Chris 嗨,我只是想仔细检查一下我的计算是否正确。我在 Python cloud.google.com/bigquery/docs/samples/... 中使用流式插入。如果我插入这个 json 对象:data = {'event': 'signup', 'email': 'abc@email.com'}。要计算大小,我应该对 json 对象进行字符串化并将字符串长度乘以 2 个字节,如下所示:len(json.dumps(data)) * 2 bytes = total size?
    【解决方案2】:

    我认为没有现成的解决方案(例如 BQ 中的函数)。

    我经常做和帮助的是使用数据集的 __TABLES__ 元数据表,以便估计表的每行平均大小

    所以,我的查询应该是这样的

    SELECT 
      table_id, 
      (size_bytes/row_count) / 1000000 as row_size -- avg row size in MB
    FROM `my_dataset.my_table.__TABLES__`
    

    【讨论】:

    • 感谢您的意见。但是,平均行大小并不是我在这里寻找的,因为我对行大小方面的异常值感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多