使用bigrquery

时间:2017-01-28 18:09:06

标签: r google-bigquery

我在循环中为数据框中的每个商店运行查询。通常存在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)
  }

1 个答案:

答案 0 :(得分:2)

解决!

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

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

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

尝试(作业&lt; -insert_query_job(sql,project = project,destination_table =“analytics.campaign_matches”,              write_disposition =“WRITE_APPEND”))   wait_for(作业)

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