使用 bigrquery 的 R 循环中的 BigQuery 超时错误

Posted

技术标签:

【中文标题】使用 bigrquery 的 R 循环中的 BigQuery 超时错误【英文标题】:BigQuery Timeout Errors in R Loop Using bigrquery 【发布时间】:2017-01-28 18:09:06 【问题描述】:

我正在为数据框中的每个商店循环运行查询。通常有 70 家左右的商店,因此对于每个完整的循环,循环都会重复很多次。

这个循环可能有 75% 的时间一直运行而没有错误。

在任何一次循环迭代中,大约有 25% 的时间出现以下错误:

curl::curl_fetch_memory(url, handle = handle) 中的错误: 已超时

然后我必须弄清楚哪个迭代被炸毁,并重复循环,不包括成功完成的迭代。

我在网上找不到任何东西来帮助我了解导致这个看似随机错误的原因。也许这是一个 BQ 技术问题?似乎与它崩溃的结果集的大小没有任何关系。

这是我的代码中执行循环的部分...同样,它在大多数情况下一直有效。跨 ID 的笛卡尔积是有意的,因为我希望每个测试 ID 与商店内所有可能的控制 ID 的每个组合。

sql<-"SELECT pstore as store, max(pretrips) as pretrips FROM analytics.campaign_ids 
  group by 1 order by 1"

store_maxtrips<-query_exec(sql,project=project, max_pages = 1)
store_maxtrips

for (i in 1:length(store_maxtrips$store)) 

  #pull back all ids shopping in same primary store as each test ID with their pre metrics  
  sql<-paste("SELECT a.pstore as pstore, a.id as test_id, 
  b.id as ctl_id,
    (abs(a.zpbsales-b.zpbsales)*",wt_pb_sales,")+(abs(a.zcatsales-b.zcatsales)*",wt_cat_sales,")+
  (abs(a.zsales-b.zsales)*",wt_retail_sales,")+(abs(a.ztrips-b.ztrips)*",wt_retail_trips,") as zscore
  FROM analytics.campaign_ids a inner join analytics.pre_zscores b
  on a.pstore=b.pstore
  where a.id<>b.id and a.pstore=",store_maxtrips$store[i]," order by a.pstore, a.id, zscore")

  print(paste("processing store",store_maxtrips$store[i]))

  query_exec(sql,project=project,destination_table = "analytics.campaign_matches",
         write_disposition = "WRITE_APPEND", max_pages = 1)
  

【问题讨论】:

在 Web UI 中执行这些查询通常需要多长时间? 它们非常快,每个在 6 到 20 秒之间。我会说平均大约是 12 秒。 您很可能会达到默认的 10 秒超时 - ***.com/questions/41494059/… 我知道有些查询需要超过 10 秒,并且没有报错。但无论如何,我想尝试增加默认值,看看是否能解决它。我正在使用 R 中的 bigrquery 包来运行循环,但我找不到任何地方来更改超时设置。你知道我可以用什么方法在 R 中为 BigQuery 会话设置超时设置吗? 嗨,马克,好名字。格雷厄姆引导我回答这个问题。我猜这是因为 bigrquery 使用的是相同的 HTTP 处理程序,该处理程序在循环中运行时会发生冲突。它不能解决问题(您可能想在 github.com/rstats-db/bigrquery/issues 上提出问题),但您可以将 query_exec 放在 try() 语句中,如果输出属于“try-error”类,则重试,例如response 【参考方案1】:

解决了!

原来我使用的是 query_exec,但我应该一直使用 insert_query_job,因为我不想检索任何结果。这些错误都发生在 R 尝试从 BigQuery 检索结果的过程中,我无论如何都不想要。

通过在我的循环中使用 insert_query_job + wait_for(job) 而不是 query_exec 命令,它消除了循环完成的所有问题。

我确实还需要添加一个 try() 函数来帮助规避一些在这种方法中仍然会出现的罕见错误。感谢 MarkeD 的这个提示。所以我的最终解决方案是这样的:

try(job

感谢所有评论并帮助我研究该问题的人。

【讨论】:

以上是关于使用 bigrquery 的 R 循环中的 BigQuery 超时错误的主要内容,如果未能解决你的问题,请参考以下文章

bigrquery 中的标准 SQL

R 中的 Bigrquery 库不上传数据并且不返回错误。按下停止时获取应用程序回调

Bigrquery 不能强制整数

BigRQuery 如何更新谷歌大查询表中的列?

R 的 bigrquery 的身份验证问题

如何使用 R DBI 和 bigrquery 将虚拟 BQ 表写回 BQ?