使用 Core Reporting Google API v4 显示超过 10000 行 (Java)

Displaying more than 10000 rows using Core Reporting Google API v4 ( Java)

我正在使用 Core Reporting API v4 获取 Google 分析数据。对于给定的维度和指标组合,我最多可以捕获 10,000 条记录。 我的问题是,如果我的查询可以产生超过 10,000 个搜索结果,那么我如何获取所有这些记录?我浏览了文档,发现在单个请求中,我们不能通过设置 ReportRequest 对象的属性来访问超过 10,000 条记录。

ReportRequest request = new ReportRequest()
    .setDateRanges(Arrays.asList(dateRange)) 
    .setViewId(VIEW_ID)
    .setDimensions(Arrays.asList(dimension))
    .setMetrics(Arrays.asList(metric))
    .setPageSize(10000); 

我们如何根据可以获得的搜索结果的数量在单个 运行 中启用多个请求。

例如:如果我的查询可以 return 35,000 条记录,那么应该有 4 个内部管理的请求(10,000,10,000、10,000 和 3,500)。

请查看此内容并为我提供一些指导。提前致谢。

The Analytics Core Reporting API returns a maximum of 10,000 rows per request, no matter how many you ask for.

如果您提出的请求将生成超过 10000 行,那么您还可以请求其他行。从第一个请求返回的响应将包含一个名为 nextPageToken 的参数,您可以使用它来请求下一组数据。

您将不得不深入研究 Java 库,我找到的关于如何做的唯一文档是 HTTP。

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    ...
    # Taken from `nextPageToken` of a previous response.
    "pageToken": "XDkjaf98234xklj234",
    "pageSize": "10000",
  }]
}

Java 中有一个稳定且经过广泛测试的解决方案。它是一种递归解决方案,每 10000 个结果批次(如果有的话)存储一次并自行调用,直到找到 null nextToken。在这个特定的解决方案中,每 10000 个结果批次被保存到一个 csv 中,然后执行递归调用!请注意,第一次从外部某处调用此函数时,nextPageToken 也是空的!!专注于递归原理和空值检查!

private static int getComplexReport(AnalyticsReporting service,int 
reportIndex,java.lang.String startDate,String endDate,ArrayList<String>
metricNames,ArrayList<String> dimensionNames,String pageToken)    
throws IOException

ReportRequest req = createComplexRequest(startDate,endDate,metricNames,dimensionNames,pageToken);

ArrayList<ReportRequest> requests = new ArrayList<>();
requests.add(req);

// Create the GetReportsRequest object.
GetReportsRequest getReport = new GetReportsRequest()
    .setReportRequests(requests);

// Call the batchGet method.
GetReportsResponse response = service.reports().batchGet(getReport).execute();
      //printResponse(response);


saveBatchToCsvFile("dummy_"+startDate+"_"+endDate+"_"+Integer.toString(reportIndex)+".csv",startDate+"_"+endDate,response,metricNames,dimensionNames);
String nextToken = response.getReports().get(0).getNextPageToken();
//System.out.println(nextToken);
if(nextToken!=null)
    return getComplexReport(service,reportIndex+1,"2016-06-21","2016-06-21",metricNames,dimensionNames,nextToken);

return reportIndex; 
} 
var reportRequest = new ReportRequest
{
    DateRanges = new List<DateRange> { dateRange },
    Dimensions = new List<Dimension> { date, UserId, DeviceCategory},
    Metrics = new List<Metric> { sessions },
    ViewId = view,
    PageSize = 400000
};