【问题标题】:Optimize cost BigQuery queries优化 BigQuery 查询的费用
【发布时间】:2020-05-12 16:03:38
【问题描述】:

我有一个名为“table1”的 BigQuery 表。该表中有 1Tb 的数据。它有这个架构:

col1, col2, col3, timestamp

我希望为在“table1”中找到的每个时间戳 YYYYMMDD 创建一个名为“table_YYYYMMDD”的表,其中包含来自“table1”的数据以及 YYYYMMDD 时间戳。

我的想法是做这个查询(这里以时间戳 20200421 为例):

select col1, col2, col3, timestamp from table1 where string(timestamp) like '*2020-04-21*'

并以这种方式运行它:

bq query --destination_table table_20200421 --use_legacy_sql=false --append --allow_large_results select col1, col2, col3, timestamp from table1 where string(timestamp) like '*2020-04-21*'

并且只为我想要的每个日期运行它。 问题是,每次运行此请求时,它都会分析 1Tb 的数据,如果您在 200 个日期内执行此操作,成本会很高。 是否有更经济有效的方式来使用 BigQuery 实现相同的结果? 可能正在将表作为 JSON 数据提取到存储并以另一种方式分析它(火花?)

谢谢你的帮助

【问题讨论】:

    标签: google-bigquery google-cloud-storage


    【解决方案1】:

    不要使用LIKE,因为它必须阅读整个内容才能知道它是否存在于值中并且不能真正跳过记录。

    尝试使用WHERE TIMESTAMP_TRUNC(timestamp, DAY) = TIMESTAMP('2020-04-21')

    现在,最优雅(在我看来也是正确的)解决方案实际上是对表进行分区。这可以通过将表复制到您配置为由timestamp 字段分区的版本来相当容易地完成。如果您对分区没有任何特殊限制,我可以添加有关此的详细信息。

    【讨论】:

    • 实际上我的表是分区的(我没有注意到,因为我没有做到)并且根据您的请求版本,它只分析了 1Tb 中的 4Go,非常感谢!但是我不明白为什么我的 where 子句在您只需要读取 4Gb 时会分析整个数据?它是否必须在两个请求中读取完全相同的数据(时间戳字段)以确定它是否符合条件?
    • BigQuery 在您的表(或您的分区)中执行全面扫描。如果你想减少这种情况,你可以集群你的表。集群就像一个复合索引。您最多可以有 3 个字段 (f1,f2,f3),并且只有在 f1 也被过滤时,您才能在 f2 上进行聚类过滤,否则不使用聚类功能
    • 它“读取”的方式在这两种情况下都非常不同。我在这里转述。如果表按日期分区,则表的每个“段”都将与一个日期相关联,那么进行日期到日期的比较非常简单。另一方面,如果您运行类似 `STRING(field) LIKE "%02%" 之类的东西,它不仅需要将字段的所有单个值转换为字符串,还需要与每个子字符串进行比较(如果有 02) . 示例 1 中创建的日期的“索引”对于早期过滤数据不再有用,因为它仍然需要操作所有单独的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多