---
description: 方舟5.0版本中新增API
---
# 自定义查询
## 1.自定义SQL查询
适合查询结果为小数据量的场景(千级数据量),例如分析结果统计,查询数据状态;如需导出更大规模数据,见【章节2.[自定义SQL导出](api_sql_query.md#2-zi-ding-yi-sql-dao-chu)】
### 1.1 接口地址
> 【POST】 /uba/api/sql/query
### 1.2 请求参数
#### 1.2.1 Body参数说明:
**body参数示例:**
```java
{
"sql": "SELECT xwhat,xwhen,xwho FROM event_vd as event where event.ds=20200214 and event.\"$startup_time\" is not null LIMIT 10",
"format": "json"
}
```
**body参数说明:**
* sql: 查询的 SQL,例如 `SELECT xwhat,xwhen,xwho FROM event_vd LIMIT 10`。
* format: 文本输出可选项包括
* csv:默认格式,sql查询结果输出为csv格式文件。默认文件编码为`UTF-8`,若导出文件要用excel打开,增加url参数`?csvUtfEncoding=0`
* json:sql查询结果输出为一个完整JSON 的json文件
#### 1.2.2 特殊说明:
1. 可供查询的表有:事件表`event_vd`,属性表`profile_vd`。
2. 事件字段、事件属性字段、用户属性字段信息可以参见 API章节中的[ 元数据管理](../api-manage-project/api-meta.md)。
3. 事件或属性字段中如果包含`$`符号的则需要对该字段加上双引号,双引号也需要转义,例如`\"$startup_time\"`。
4. **认证参数**:接口必传token和appKey两个参数,详情见 [项目接口认证](../README.md)
5. 表名可以不附带数据库名,API程序会根据认证参数,自动为表名加上数据库名,如果自带不符合认证校验的数据库名,接口将返回参数异常,提示包含非当前项目的数据库表
6. 不支持数据操纵语言DML、数据定义语言DDL以及数据控制语言DCL,只支持数据查询语言DQL(基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块)
7. API程序默认开启 `limit` 检测,查询记录数不能超过系统配置的参数项`arkweb.open_api.sqlquery.limit`,该参数可以通过`ambari管理平台`进行变更设置,设置为`-1`表示不限制查询记录条数
### 1.3 返回结果示例
**format为 csv类型**
```java
xwhen,xwhat,xwho,
1581648715861,$pageview,JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b,
1581648718542,$pageview,JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b,
1581648726163,$pageview,JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b,
```
**format为 json类型**
```javascript
[
{
"xwhen": 1581648715861,
"xwhat": "$pageview",
"xwho": "JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b"
},
{
"xwhen": 1581648718542,
"xwhat": "$pageview",
"xwho": "JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b"
},
//....
]
```
### **1.4 接口调用示例**
```haskell
curl -H "Content-Type:application/json" -H "token:4113c9cad1c301113783f433e254888c" -H "appKey:31abd9593e9983ec" -X POST --data '{
"sql": "SELECT xwho,xwhat,xwhen,\"$browser\" FROM event_vd as event where event.ds=20200214 and event.\"$startup_time\" is not null LIMIT 2",
"format": "csv"
}' http://127.0.0.1:4005/uba/api/sql/query
```
## 2. 自定义SQL导出
适合sql查询结果为较大数据量的场景(百万级数据量),例如导出事件数据,导出用户数据
### 2.1 接口地址
> 【POST】 /uba/api/sql/export
### 2.2 请求参数
#### 2.2.1 Body参数说明:
**body参数示例:**
```java
{
"sql": "SELECT xwhat,xwhen,xwho FROM event_vd as event where event.ds=20200214 and event.\"$startup_time\" is not null LIMIT 10",
"format": "json"
}
```
**body参数说明:**
* sql: 查询的 SQL,例如 `SELECT xwhat,xwhen,xwho FROM event_vd LIMIT 10`。
* format: 文本输出可选项包括
* csv:默认格式,sql查询结果输出为csv格式文件。默认文件编码为`UTF-8`,若导出文件要用excel打开,增加url参数`?csvUtfEncoding=0`
* json:sql查询结果输出为**每行一个JSON** 的json文件
#### 2.2.2 特殊说明:
1. 可供查询的表有:事件表`event_vd`,属性表`profile_vd`。
2. 事件字段、事件属性字段、用户属性字段信息可以参见 API章节中的 [元数据管理](../api-manage-project/api-meta.md)。
3. 事件或属性字段中如果包含`$`符号的则需要对该字段加上双引号,双引号也需要转义,例如`\"$startup_time\"`。
4. **认证参数**:接口必传token和appKey两个参数,详情见 [项目接口认证](../#21-xiang-mu-jie-kou-ren-zheng)。
5. 表名可以不附带数据库名,API程序会根据认证参数,自动为表名加上数据库名,如果自带不符合认证校验的数据库名,接口将返回参数异常,提示包含非当前项目的数据库表
6. 不支持数据操纵语言DML、数据定义语言DDL以及数据控制语言DCL,只支持数据查询语言DQL(基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块)
7. 该接口不对sql 进行limit 限制,但受限于查询时长,默认在10分钟超时时间内,经过测试该API能够导出200万左右条记录(仅供参考,不同机器配置和查询列数差异会导致可导出记录数存在一定的偏差)
### 2.3 返回结果示例
**format为 csv类型的输出举例:**
```java
xwhen,xwhat,xwho,
1581648715861,$pageview,JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b,
1581648718542,$pageview,JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b,
1581648726163,$pageview,JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b,
```
**format为 json类型输出举例:**
```javascript
{"xwhen":1581648726045,"$browser":"Chrome","xwho":"JS4a8bf500c4f4aadfdf3a43586d9008fd4a8b","xwhat":"login"}
{"xwhen":1581650573221,"$browser":"Chrome","xwho":"a5qvKY6K1000047yuanyw@analysys.com.cn","xwhat":"login"}
{"xwhen":1581678914730,"$browser":"Firefox","xwho":"JS2db3b546aac1fd04f54d29a574a186042db3","xwhat":"login"}
{"xwhen":1581678914730,"$browser":"Firefox","xwho":"JS2db3b546aac1fd04f54d29a574a186042db3","xwhat":"login"}
{"xwhen":1581651522435,"$browser":"Chrome","xwho":"JS8ae9e9bf73b5b0dc3e42c8d31dd8078a8ae9","xwhat":"login"}
{"xwhen":1581669615438,"$browser":"Firefox","xwho":"JS4d372a84aa14b9279c0c35db28c3cb544d37","xwhat":"login"}
```
**输出结果备注:**
> 1. `/sql/export` 接口输出,因为可以支撑大数据量,为了方便客户端可以进行批次处理,json类型的输出并非是一个完整的json数组,而是一行一条json(无`[]`,按`\n\`分割)
> 2. `/sql/export`接口输出,因为可以支撑大数据量,接口response为 流式输出。如果是通过程序来调用,那么建议:
> * 避免一次性加载response到内存中,改为流式接收 response body
> * `Http Connection` 需要增加`SocketTimeout`时长,如果下载过程出现504 网关超时,则需要修改nginx 超时配置
### 2.4 接口调用示例
导出日期为20200214的所有事件数据,输出写入到output.json 文件中
```haskell
curl -o output.json -H "Content-Type:application/json" -H "token:3edbaf427ecdda80beef322ad3c333a4" -H "appKey:31abd9593e9983ec" -X POST --data '{
"sql": "SELECT xwho,xwhat,xwhen,\"$browser\" FROM event_vd as event where event.ds=20200214",
"format": "json"
}' http://127.0.0.1:4005/uba/api/sql/export
```
### 2.5 Java HttpClient 接口调用示例
```java
public void testSqlExport(){
// 依赖 org.apache.httpcomponents 的 httpclient 包
static String UTF = "UTF-8";
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://127.0.0.1:4005/uba/api/sql/export");
//Header 参数
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("appKey", YOUR_APP_KEY);
httpPost.setHeader("token", YOUR_APP_TOKEN);
// post body params
Map<String,Object> params = new HashMap<>();
params.put("format", "json");
params.put("sql", "select * from profile_vd where arkfq_5=1");
ObjectMapper objectMapper = new ObjectMapper();
StringEntity stringEntity = new StringEntity(objectMapper.writeValueAsString(params), UTF);
stringEntity.setContentEncoding(UTF);
httpPost.setEntity(stringEntity);
//set timeout
RequestConfig reqConfig = RequestConfig.custom()
.setSocketTimeout(10*60*1000).setConnectTimeout(60*1000).build();
httpPost.setConfig(reqConfig);
//假设存到 output.txt(也可以是其他处理方式)
File dir = new File("/tmp");
File file = new File(dir, "output.txt");
try (CloseableHttpResponse response1 = client.execute(httpPost);
FileOutputStream fos = new FileOutputStream(file)) {
final HttpEntity entity = response1.getEntity();
if (entity != null) {
try (InputStream inputStream = entity.getContent()) {
// TODO: do something useful with the stream
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = br.readLine()) != null) {
// TODO: process the line.
// 以文件存储为例,按行读取,按行写入
fos.write((line+"\n").getBytes(UTF));\
}
}
}
EntityUtils.consume(entity);
}
}
}
```
- 产品简介
- 快速上手
- Step 1 安装部署
- Step 2 激活系统创建项目
- Step 3 开启您的分析旅程
- 1. 集成 SDK
- 2. 可视化埋点
- 3. 创建分析模型
- 附:埋点方案设计
- 附:数据分析思路
- 产品更新日志
- V5.5 新增LTV分析功能等
- V5.3 UI 升级、分布分析重构、维度表动态更新、细节优化等
- V5.2 新增归因分析、消息中心、重构埋点方案、优化看数据体验……
- V5.1.0317 体验优化& Bug修复
- V5.1 升级可视化埋点、增强权限控制……
- Part I 产品功能说明
- 名词解释
- 指标说明
- 看板
- 5.3.3 看板 UI 重构
- 分析
- 事件分析
- 渠道分析
- 渠道相关名词解释
- 来源识别规则
- 搜索引擎
- 社交媒体
- 小程序场景值
- Session 分析
- Session 规则
- 实时分析
- 留存分析
- 转化漏斗
- 智能路径
- 归因分析
- 热图分析
- Web/H5 热图
- APP 热图
- 分布分析
- 间隔分析
- 属性分析
- LTV 分析
- 多主体分析
- 自定义查询
- 用户
- 用户分群
- 用户探查
- 用户标签
- 标签体系应用概览
- 标签体系
- 标签生命周期管理
- 标签加工
- 如何自定义SQL创建标签
- 单用户档案
- 运营
- 广告跟踪
- 微信小程序渠道追踪
- 预置广告媒介和渠道
- App 推广监测(Beta版本)
- 电子邮件(即将下线)
- 短信(即将下线)
- 消息通知(即将下线)
- 项目管理
- 项目概览
- 项目角色管理
- 项目成员管理
- 数据接入管理
- 埋点方案
- 可视化埋点
- 集成SDK接入数据
- 数据验证
- 用户数据导入
- 微信小程序全埋点事件定义
- 元数据管理
- 元事件
- 虚拟事件
- 事件属性
- 用户属性
- Session 管理
- 页面组管理
- 维度表
- 服务集成配置
- 监控告警
- 智能监控
- 自定义监控
- 平台管理
- 企业概览
- 项目管理
- 成员管理
- 安全设置
- 企业设置
- 日志管理
- 帐号设置
- Part II 技术文档
- 技术接入准备工作
- 部署环境检测工具
- 数据模型
- 数据格式
- 预置事件和属性
- App预置事件/属性
- JS 预置事件/属性
- 如何准确识别用户
- 如何设计埋点方案
- 分平台上报数据 vs 跨平台打通
- SDK 指南
- Android SDK
- 快速集成
- 全埋点模块
- 消息推送模块
- Android Hybrid模式
- SDK Gradle集成方式
- 多渠道打包
- 易观小工具
- 合规相关
- iOS SDK
- 快速集成
- 全埋点介绍
- iOS Hybrid模式
- 消息推送模块
- JS SDK
- 快速集成
- JS SDK基础版
- JS SDK插件
- uni-app SDK
- 快速集成
- 打包原生APP
- 开启移动端全埋点
- uni-app SDK标准版
- 微信小程序 SDK
- 快速集成
- 微信小程序标准版
- 微信小程序插件版
- 微信小程序通用框架版
- 支付宝小程序 SDK
- 支付宝小程序标准版
- 支付宝小程序通用框架版
- 字节跳动小程序 SDK
- 字节跳动小程序标准版
- 字节跳动小程序通用框架版
- 百度小程序 SDK
- 百度小程序标准版
- 百度小程序通用框架版
- 钉钉小程序 SDK
- 钉钉小程序标准版
- 钉钉小程序通用框架版
- QQ小程序 SDK
- QQ小程序标准版
- QQ小程序通用框架版
- 快应用 SDK
- 华为WeCode小程序
- WeCode SDK 标准版
- WeCode SDK插件
- PhoneGap SDK
- mPaaS SDK
- ReactNative SDK
- Flutter SDK
- Java SDK
- Python SDK
- PHP SDK
- C++ SDK
- C# SDK
- Node JS SDK
- Lua SDK
- Golang SDK
- SDK FAQ
- identify与alias的区别
- 爬虫数据如何识别?
- 页面停留如何获取时间?
- 如果获取SDK及更新日志
- 代码埋点和无埋点有什么区别
- Web页面中发现丢失某一个事件
- 自研 SDK 注意事项
- 页面时长统计功能
- 飞书小程序 SDK
- 飞书小程序标准版
- 飞书小程序通用框架版
- Unreal Engine SDK
- 数据验证
- 客户端埋点验证
- Debug 数据验证
- 数据入库验证
- 数据导入
- 接口导入
- JAVA工具包
- 标准json文件导入
- csv格式导入
- 数据导入FAQ
- 数据导出
- JAVA工具包
- 事件数据导出
- 用户数据导出
- 直接从Kafka中消费数据
- 使用程序访问数据库
- 脚本工具
- API
- 分析API
- 事件分析
- 留存分析
- 自定义查询
- 转化漏斗
- 属性分析
- Session分析
- 渠道分析
- 分布分析
- 用户API
- 分群查询
- 用户档案
- 分群管理
- 管理API
- 权限管理
- 元数据管理
- 埋点方案管理
- 维度表管理
- 运营API
- 广告跟踪
- APP推广监测
- 平台管理API
- 项目管理
- 成员管理
- 第三方登录
- OAuth2.0登录
- LDAP登录
- GDPR 合规
- Part III 常见问题
- License 许可
- 产品试用及采购
- 参与贡献