实际
我一直在使用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请求被跳过,直到循环结束,当它们再次出现时要求?