开通OpenApi返还流程
第一步:在OpenAPI卡片中点击开通
点击【立即开通】后,弹出【确认开通Open API】对话框,可以选择:1.【开通并例行订阅】 即每天会自动将数据准备好,客户可随时下载,同时每天例行的数据准备会消耗流量费用;2.【仅开通】只会开通服务,但数据不会每天准备好,需要通过手动提交补投任务 或 OpenAPI 补投,此时只会按单次补投任务的流量来计费。
注:不论使用例行和单次补投哪种数据返还方式,都需要提前购买流量包。但对于首次开通数据返还服务的客户(不包括关闭再开通的情况),为方便测试使用,系统会默认免费补投近7天的历史数据。

开通Open API服务后,通过下面的开关可以开通和关闭例行订阅

通过查询可下载文件列表,可以获取可下载的文件

如需历史数据,需要通过OpenAPI补投

第二步:获取访问凭证
第三步:访问OpenAPI文档
进行API调试、查看API使用方式,至此完成通过OpenAPI以离线文件形式投递明细数据的服务开通。
Beta版本已支持通过OpenAPI单次获取近30日内、指定日期的明细数据离线文件下载地址,如有通过离线文件下载历史明细数据的需求,请您使用历史数据补投的OpenAPI先提交补投申请,DOP服务完成数据准备后,即可获取相关的离线文件下载地址。
正式版支持以订阅的方式进行数据主动投递,客户开通订阅服务后数据会每天例行准备好,客户每天可以例行下载,不需要提交补投任务。
第四步:获取SDK代码或示例
请到DOP的API调试页面获取基础OpenAPI代码

如上,您必须在调式参数填入任意参数,先点击「发起调用」后在右侧面板即可获取基础示例代码。
如果您需要结合3个相关接口进行整合满足下载需求,可参考如下示例Demo
数据返还OpenAPI的示例代码
package com.alibaba.lindorm.sql.demo.mybatis.service;
import com.alibaba.fastjson.JSON;
import com.aliyun.dop20221130.Client;
import com.aliyun.dop20221130.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DopTest {
// 获取友盟OpenAPI的accessKeyId
private static final String ACCESS_KEY_ID = "您的AK";
// 获取友盟OpenAPI的accessKeySecret
private static final String ACCESS_KEY_SECRET = "您的SK";
/**
* 主题包和表映射
* */
public enum PackageTableEnum{
/**
* U-APP主题包
* */
UAPP(1, Arrays.asList(UAPP_TABLES.split(","))),
/**
* U-WEB主题包
* */
UWEB(2, Arrays.asList(UWEB_TABLES.split(","))),
/**
* U-PUSH主题包
* */
UPUSH(3, Arrays.asList(UPUSH_TABLES.split(","))),
/**
* U-MINI小程序主题包
* */
UMINI(4, Arrays.asList(UMINI_TABLES.split(","))),
;
Integer packageId;
List<String> tables;
PackageTableEnum(Integer packageId, List<String> tables) {
this.packageId = packageId;
this.tables = tables;
}
public static PackageTableEnum getByTable(String table) {
PackageTableEnum[] packageTableEnums = PackageTableEnum.values();
for(PackageTableEnum packageTableEnum : packageTableEnums) {
if (packageTableEnum.getTables().contains(table)) {
return packageTableEnum;
}
}
return null;
}
public Integer getPackageId() {
return packageId;
}
public List<String> getTables() {
return tables;
}
}
// U-APP分析主题包支持返还的表名(29张),也可以根据自己需要自定义指定
private static final String UAPP_TABLES = "dws_ump_log_uapp_channel_1d," +
"dws_ump_log_uapp_version_top_1d," +
"dws_ump_log_uapp_1d," +
"dwd_ump_log_uapp_error_di," +
"dws_ump_log_uapp_channel_label_new_1d," +
"dws_ump_log_uapp_error_version_1d," +
"dws_ump_log_uapp_channel_profile_rate_cw," +
"dws_ump_log_uapp_retention_1d," +
"dws_ump_log_uapp_version_os_1d," +
"dws_ump_log_uapp_channel_top_1d," +
"dwd_ump_log_uapp_launch_di," +
"dwd_ump_log_uapp_event_json_di," +
"dws_ump_log_uapp_version_device_1d," +
"dws_ump_log_uapp_all_device_model_30d," +
"dws_ump_log_uapp_retention_channel_1d," +
"dws_ump_log_uapp_error_os_1d," +
"dws_ump_log_uapp_retention_version_1d," +
"dws_ump_log_uapp_error_channel_1d," +
"dws_ump_log_uapp_user_count_td," +
"dws_ump_log_uapp_version_1d," +
"dws_ump_log_uapp_duration_activity_1d," +
"dws_ump_log_uapp_all_os_30d," +
"dim_ump_device_uapp_model_specs," +
"dws_ump_log_uapp_version_os_newuser_7d," +
"dws_ump_log_uapp_newuser_7d," +
"dws_ump_log_uapp_30d," +
"dws_ump_log_uapp_channel_newuser_7d," +
"dws_ump_log_uapp_version_device_newuser_7d," +
"dwd_ump_log_uapp_retail_event_ekv_di," +
"dim_ump_uapp_app_key";
// U-WEB分析主题包支持返还的表名(2张),也可以根据自己需要自定义指定
public static final String UWEB_TABLES = "dwd_ump_log_uweb_di," +
"dwd_ump_log_uweb_event_di";
// U-PUSH分析主题包支持返还的表名(3张),也可以根据自己需要自定义指定
public static final String UPUSH_TABLES = "dwd_ump_log_upush_uninstall_di," +
"dwd_ump_log_upush_launch_di," +
"dwd_ump_log_upush_message_di";
// U-MINI分析主题包支持返还的表名(4张),也可以根据自己需要自定义指定
public static final String UMINI_TABLES = "dwd_ump_log_mini_program_launch_di," +
"dwd_ump_log_mini_program_event_di," +
"dwd_ump_log_mini_program_retail_event_ekv_di," +
"dws_ump_log_mini_program_retail_base_1d";
/**
* 使用AK&SK初始化账号Client
* 获取AK&SK地址https://devs.umeng.com/api/credentials
* */
public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new com.aliyun.teaopenapi.models.Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dop.openapi.umeng.com";
return new Client(config);
}
/**
* A、获取指定时间范围、指定表的返还文件目录可下载的文件列表信息(start和end时间窗口为30天,start和end时间均不能为>=today的时间)
* @param start 开始时间 yyyyMMdd格式
* @param end 开始时间 yyyyMMdd格式
* @param tableName 需要返还的表名
* @return
*/
public static GetOssMetaListResponse getOssDirMetas(String start, String end, String tableName) throws Exception {
Client client = createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
GetOssMetaListRequest getOssMetaListRequest = new GetOssMetaListRequest()
.setStart(start)
.setEnd(end)
.setTableName(tableName);
Map<String, String> headers = new HashMap<>();
try {
GetOssMetaListResponse response = client.getOssMetaListWithOptions(getOssMetaListRequest, headers, new RuntimeOptions());
//System.out.println("获取OssMeta列表:" + JSON.toJSONString(response));
return response;
} catch (TeaException error) {
// 如有需要,请打印 error
throw error;
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
throw error;
}
}
/**
* B、数据返还进行oss文件下载
* @param ds 时间 yyyyMMdd格式,ds不得>=today的时间
* @param tableName 需要数据返还下载的表名
* @return
* */
public static GetOssMetaDownloadResponse getOssMetaDownloadFiles(String ds, String tableName) throws Exception {
Client client = createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
GetOssMetaDownloadRequest getOssMetaDownloadRequest = new GetOssMetaDownloadRequest()
.setDs(ds)
.setTableName(tableName);
java.util.Map<String, String> headers = new java.util.HashMap<>();
try {
// 复制代码运行请自行打印 API 的返回值
GetOssMetaDownloadResponse ossMetaDownloadsResp = client.getOssMetaDownloadWithOptions(getOssMetaDownloadRequest, headers, new com.aliyun.teautil.models.RuntimeOptions());
return ossMetaDownloadsResp;
} catch (TeaException error) {
// 如有需要,请打印 error
Common.assertAsString(error.message);
System.out.println("download errors:" + JSON.toJSONString(error));
throw error;
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
Common.assertAsString(error.message);
throw error;
}
}
/**
* C、任务补投递
* @param start 开始时间 yyyyMMdd格式
* @param end 结束时间 yyyyMMdd格式
* @param packageId 主题包ID
* */
public static SubmitBackfill4ApiResponse submitBackfill4Api(String start, String end, Integer packageId) throws Exception {
Client client = createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
SubmitBackfill4ApiRequest submitBackfill4ApiRequest = new SubmitBackfill4ApiRequest()
.setPackageId(packageId)
.setStart(start)
.setEnd(end);
java.util.Map<String, String> headers = new java.util.HashMap<>();
try {
// 复制代码运行请自行打印 API 的返回值
SubmitBackfill4ApiResponse submitBackfill4ApiResp = client.submitBackfill4ApiWithOptions(submitBackfill4ApiRequest, headers, new RuntimeOptions());
return submitBackfill4ApiResp;
} catch (TeaException error) {
// 如有需要,请打印 error
throw error;
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
throw error;
}
}
/**
* 实现按照指定时间范围+表名的数据返还需要3个接口配合(A+B接口组合查询,C接口单次补投递)
* */
public static void main(String[] args_) throws Exception {
// 需要数据返还时间范围(startDate和endDate时间窗口为30天)
String startDate = "20221226";
String endDate = "20221227";
// 需要数据返还下载的主题包
PackageTableEnum packageTableEnums = PackageTableEnum.UAPP;
try {
for(String table : packageTableEnums.getTables()) {
GetOssMetaListResponse ossDirMetasResp = getOssDirMetas(startDate, endDate, table);
if (ossDirMetasResp == null || ossDirMetasResp.getStatusCode() != 200) continue;
List<GetOssMetaListResponseBody.GetOssMetaListResponseBodyData> metas= ossDirMetasResp.getBody().getData();
//如果meta是空,说明还没有生成目录,需要单独去提交一下补投的接口,补投递的接口提交后后台大约10分钟左右会补投完毕
//System.out.println("meta size:" + metas.size()+ " detail=" +
// JSON.toJSONString(metas)+" start=" + startDate + " end=" + endDate + " table=" + table);
for(GetOssMetaListResponseBody.GetOssMetaListResponseBodyData meta : metas) {
String ds = meta.getDs();
GetOssMetaDownloadResponse ossMetaDownloadResp = getOssMetaDownloadFiles(ds, table);
if (ossMetaDownloadResp == null || ossMetaDownloadResp.getStatusCode() != 200) continue;
System.out.println("日期=" + ds + ",表名=" + table + ",下载链接=" + JSON.toJSONString(ossMetaDownloadResp.getBody().getData()));
}
}
} catch (Exception e) {
// 如有需要,请打印 error
System.out.println("ERR:" + JSON.toJSONString(e));
}
//----返还数据进行补投递(指定时间范围内 + 主题分析包)----
//补投调用时机:当获取Meta列表接口的data为空,则需要补投递(例如:补投UAPP主题包,就会回补该主题包下29张表)
//即当根据[时间范围+表名]去查询可返回下载的Meta目录列表时,如果没返回(说明主题包没投递过),则需要根据[该时间范围+该表对应的主题包]去提交一次补投任务
PackageTableEnum packageTableEnum = PackageTableEnum.getByTable("dwd_ump_log_mini_program_event_di");
SubmitBackfill4ApiResponse backfillResp = submitBackfill4Api(startDate, endDate, packageTableEnum.getPackageId());
//System.out.println("补投递提交结果:" + JSON.toJSONString(backfillResp, SerializerFeature.PrettyFormat));
}
}
第五步:快速预览下载的ORC文件
使用友盟数据返还下载的文件,当前只支持orc格式,可借助orc提供的工具进行快速预览
下载orc Java 工具到本地 地址:orc-tools
数据预览
java -jar orc-tools-1.7.2-uber.jar data -n 5 xxxx.orc

orc-tools 更多详细使用参见官方介绍 : https://orc.apache.org/docs/java-tools.html