在bigquery中创建非常大的表的ID的成对组合

时间:2018-12-28 18:56:21

标签: google-bigquery combinations standard-sql

我有一个很大的id(字符串)表,它有424,970行,只有一列。

我正在尝试在新表中创建这些ID的组合。可以在此question中找到创建该表的动机。

我尝试了以下查询来创建成对组合表:

#standardSQL
SELECT
  t1.id AS id_1,
  t2.id AS id_2
FROM
  `project.dataset.id_vectors` t1
INNER JOIN
  `project.dataset.id_vectors` t2
ON
  t1.id < t2.id

但是查询在15分钟后失败,并显示以下错误消息:

Query exceeded resource limits. 602467.2409093559 CPU seconds were used, and this query must use less than 3000.0 CPU seconds. (error code: billingTierLimitExceeded)

是否有任何变通办法来运行查询并获得具有所有ID组合的所需输出表?

1 个答案:

答案 0 :(得分:2)

您可以尝试将表T拆分为2个较小的表T1和T2,然后对每个较小的表T1:T1,T1:T2,T2:T1,T2:T2执行4个联接,然后合并结果。这等同于将T与自身连接在一起。如果仍然失败,请尝试将其分解为更小的表。

或者将maximumBillingTier设置为较高的值https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs

  

configuration.query.maximumBillingTier-将帐单层限制为   这份工作。资源使用超出此层的查询将失败   (不收取费用)。如果未指定,则将其设置为您的   项目默认值。

如果使用Java,则可以在JobQueryConfiguration中进行设置。目前,UI控制台中不支持此配置属性。


为了拆分表,您可以在BigQuery中使用FARM_FINGERPRINT函数。例如。第一部分将有一个过滤器:

where mod(abs(farm_fingerprint(id)), 10) < 5

第二部分将进行过滤:

where mod(abs(farm_fingerprint(id)), 10) >= 5