实际

我一直在使用RSiteCatalyst包一段时间了 . 对于那些不了解它的人来说,这使得通过API从Adobe Analytics获取数据的过程变得更加容易 .

到目前为止,工作流程如下:

  • 提出请求,例如:
key_metrics <- QueueOvertime(clientId, dateFrom4, dateTo,
                   metrics = c("pageviews"), date.granularity = "month",
                   max.attempts = 500, interval.seconds = 20)
  • 等待将保存为data.frame的响应(示例结构):
> View(head(key_metrics,1)) 
    datetime      name         year   month   day    pageviews 
  1 2015-07-01    July 2015    2015   7       1      45825
  • 做一些数据转换(例如:

key_metrics$datetime <- as.Date(key_metrics$datetime)

这个工作流程的问题在于,有时(由于请求复杂性),我们可以等待很长时间,直到响应最终到来 . 如果R脚本包含40-50个相同复杂的API请求,则意味着我们将等待40-50次,直到数据最终到来并且我们可以执行新请求 . 这显然在我的ETL过程中生成了一个bootleneck .

目标

但是,在程序包的大多数功能中都有一个参数 enqueueOnly ,它告诉Adobe在将报告ID作为响应提交时处理请求:

key_metrics <- QueueOvertime(clientId, dateFrom4, dateTo,
               metrics = c("pageviews"), date.granularity = "month",
               max.attempts = 500, interval.seconds = 20,
               enqueueOnly = TRUE)

> key_metrics
[1] 1154642436

我可以通过使用以下函数随时获得“真实”响应(这与数据有关):

key_metrics <- GetReport(key_metrics)

在每个请求中,我在生成报告ID和报告名称列表时添加参数 enqueueOnly = TRUE

queueFromIds <- c(queueFromIds, key_metrics)
queueFromNames <- c(queueFromNames, "key_metrics")

这种方法最重要的区别是我的所有请求都是由Adobe同时处理的,因此等待时间大大减少 .

问题

但是,通过有效地获取数据,我遇到了问题 . 我正在尝试使用 while 循环,一旦获得数据,就会从先前的向量中删除密钥ID和密钥名称:

while (length(queueFromNames)>0)
{
  assign(queueFromNames[1], GetReport(queueFromIds[1],
                                      max.attempts = 3,
                                      interval.seconds = 5))
  queueFromNames <- queueFromNames[-1]
  queueFromIds <- queueFromIds[-1]
}

但是,只有在请求足够简单以便在几秒钟内处理时,这才有效 . 当请求足够复杂,无法在3次尝试中处理,间隔为5秒时,循环将停止并显示以下错误:

ApiRequest中的错误(body = toJSON(request.body),func.name =“Report.Get”,:错误:超过https://api3.omniture.com/admin/1.4/rest/?method=的最大尝试次数Report.Get

哪些函数可以帮助我控制所有API请求被正确处理,并且在最佳情况下,需要额外时间(它们生成错误)的API请求被跳过,直到循环结束,当它们再次出现时要求?