Google bigquery 优化成本查询查询

Google bigquery 优化成本查询查询,google-bigquery,google-cloud-storage,Google Bigquery,Google Cloud Storage,我有一个BigQuery表,叫做“table1”。此表中有1Tb的数据。它具有以下模式: col1, col2, col3, timestamp 对于“table1”中的每个时间戳YYYYMMDD,我希望生成一个名为“table_YYYYMMDD”的表,其中包含具有YYYYMMDD时间戳的“table1”中的数据 我的想法是在这里查询时间戳20200421,例如: select col1, col2, col3, timestamp from table1 where string(times

我有一个BigQuery表,叫做“table1”。此表中有1Tb的数据。它具有以下模式:

col1, col2, col3, timestamp
对于“table1”中的每个时间戳YYYYMMDD,我希望生成一个名为“table_YYYYMMDD”的表,其中包含具有YYYYMMDD时间戳的“table1”中的数据

我的想法是在这里查询时间戳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数据并以另一种方式进行分析

感谢您的帮助

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

尝试使用WHERE TIMESTAMP_truncttimestamp,DAY=TIMESTAMP'2020-04-21'


现在,在我看来,最优雅、最正确的解决方案实际上是对表进行分区。通过在表上复制到您配置为按时间戳字段分区的版本,可以相当容易地完成这一点。如果您对分区没有任何特别的限制,我可以添加关于这方面的详细信息

事实上,我的表是分区的,我没有注意到,因为我没有这样做,而且对于您的请求版本,它只分析1Tb中的4Go,非常感谢!但是我不明白为什么我的where子句让它分析整个数据,而你的数据只需要读取4Gb?难道它不需要读取两个请求中的时间戳字段中完全相同的数据来判断它是否符合条件吗?BigQuery在表或分区中执行完全扫描。如果你想减少这一点,你可以把你的桌子组合起来。集群就像一个复合索引。您最多可以有3个字段f1、f2、f3,并且仅当f1也被过滤时,您才能使用f2上的聚类进行过滤,否则聚类功能不可用。在这两种情况下,它的读取方式都非常不同。我在这里解释。如果表是按日期划分的,那么表的每个部分都将与一个日期相关联,那么进行日期到日期的比较是非常简单的。另一方面,如果运行类似于“%02”的“STRINGfield”,它不仅要将字段的所有单个值转换为字符串,而且还要与每个子字符串进行比较(如果有02)。示例1中创建的日期索引对于早期筛选数据不再有用,因为它仍然需要操作所有单个值