Fili 以数据查询为核心,提供快速简洁的 API。
API 采用 HTTPS GET 调取数据, 查询只需用一个简单的 URL,便于存储和共享。
Fili API 涉及五个主要概念:
数据维度(Dimensions)定义您如何去划分数据(slice and dice),用于数据分组,聚合,筛选数据,是整个系统之核心组成部分。每个维度包含值域 (fields),每个值域有一系列的值。这些值域和值主要用于数据筛选和标注(Annotating)查询结果。
所有维度包含一个 ID 值域(用作数据库的 key)和关于这个维度的描述(便于人们阅读理解,也是一个值域),这两项可以用来筛选 查询结果,每条结果用行(rows)表示,返回的数据中亦会包含这两项。
调取所有维度:
GET https://sampleapp.fili.org/v1/dimensions
调取某一维度:
GET https://sampleapp.fili.org/v1/dimensions/productRegion
调取某一维度的值:
GET https://sampleapp.fili.org/v1/dimensions/productRegion/values
查询维度的值还包含一些访问可选项:
| 例如,得到[维度描述包含”U”的用户所处国家,第二页,每页五项结果,用 JSON 表示](https://sampleapp.fili.org/v1/dimensions/userCountry/values?filters=userCountry | desc-contains[U]&page=2&perPage=5&format=json): | 
GET https://sampleapp.fili.org/v1/dimensions/userCountry/values?filters=userCountry|desc-contains[U]&page=2&perPage=5&format=json
度量(Metrics)是具体的数据,例如网页访问量,日均使用时间等等。度量存在于某个时间精度(time grain)下的数据列表(table) 中,查看所有的度量,您可以访问这个数据列表或者直接访问度量资源端点(metrics endpoint)获取所有系统支持的度量
查看所有度量:
GET https://sampleapp.fili.org/v1/metrics
查看某一度量:
GET https://sampleapp.fili.org/v1/metrics/timeSpent
列表(Tables)可以显示在某度量(metrics),某维度(dimensions),某精度(time grain)下的 数据。每个列表在某个精度上,都有一组可访问的度量和维度。
显示所有列表:
GET https://sampleapp.fili.org/v1/tables
显示某个列表:
GET https://sampleapp.fili.org/v1/tables/network/week
筛选(Filters)功能可以过滤数据。不同的资源对应不同的筛选:筛选功能可以过滤某一行或多行(rows)数据库返回的数据,也可以 筛选系统内部处理的数据。
如果访问请求不是针对数据资源(non-Data resource)的,由于没有数据聚合(data aggregation),筛选功能在这里主要是增删相应 数据。
但如果访问请求是针对数据资源的话,就会过滤相应数据出现之前的数据了,会影响哪些数据被调取出来。如果要像访问 非数据资源那样筛选相应数据,访问请求就必须在维度筛以外,在访问路径后头附上一个维度划分路径。
查询中用到的时间段(Interval,或者 dateTime)指的是访问数据所处的时间范围。时间段用一个起始时间和终止时间表示,表示
方法采用 ISO 8601 格式,即包含起始时间,但不包括终止时间。您可以很快适应这种时间段的表述方式。
特别注意,时间段必须和查询语句中的精度相吻合。例如,如果精度是”月份”,时间段必须以某月份边界作为起止,如果是 以星期为单位,则必须以星期一作为起止(我们约定星期一作为星期边界)。
精度是每行返回数据的数据时间跨度(granularity 或者 “bucket size”),换言之,精度是数据聚合的时间范围。精度在和计数相关的 度量里用得十分普遍,例如计算 ID 的个数。
目前支持的精度有秒,分钟,小时,天,星期,月,季度,年。还有一个”全部(all)”精度,把所有数据聚合到一个单元里。
数据查询是 Fili API 的核心功能,数据资源可以:
我们先举例讲解一下查询 URL 的格式:
GET https://sampleapp.fili.io/v1/data/network/week?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-09-01/2014-09-08
这个基本的查询语句, 返回的是一个星期以内,网页访问数和日均在线时间的数据。我们来具体讲解一下其组成。
了解了基本的查询语句后,您也许想查询某个维度上的数据,例如Product Region 维度?
GET https://sampleapp.fili.io/v1/data/network/week/productRegion?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-09-01/2014-09-08
我们在原有的 URL 上添加了一段路径(productRegion)。任意数量的维度都可以在精度之后作为额外路径添加。
照此原理,如果我们还想在此基础上添加 gender
(两个维度的划分),我们可以用:
GET https://sampleapp.fili.io/v1/data/network/week/productRegion/gender?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-09-01/2014-09-08
| 除了维度划分,我们还可以在此基础上加上其他筛选数据。比如说我们想得到[美国以外的全球数据](https://sampleapp.fili.io/v1/data/network/week?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-09-01/2014-09-08&filters=productRegion | id-notin[Americas+Region])? | 
GET https://sampleapp.fili.io/v1/data/network/week?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-09-01/2014-09-08&filters=productRegion|id-notin[Americas Region]
我们在查询语句里添加了一个筛选项,过滤掉(notin)productRegion 维度里 ID 是Americas Region 的数据。我们还
去掉了划分维度 productRegion,因为我们需要全球的整体数据,加了分组维度只会按地区显示某个地区的数据。
这个例子展示了如何在不指定划分维度的情况下,筛选这个维度里的数据。筛选功能完善且强大,更多功能请参阅筛选。最后提及一点,
对于数据资源(Data resource),筛选器支持 in,notin,eq,startswith,contains 筛选,startswith,contains` 可以
选择性关闭。
最后,我们想对结果使用 CSV 表示, 把结果可以放进 Excel 做下一步处理。Fili API 完全支持 CSV!
GET https://sampleapp.fili.io/v1/data/network/week?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-09-01/2014-09-08&filters=productRegion|id-notin[Americas Region]&format=csv
Fili 支持其他更多的数据格式,详见数据格式单元!
Fili API 可供访问的资源支持很多查询选项。以下是这些选项和它们的用法:
分页把数据结果分成多个页面,根据需求每次返回一个页面的数据。您不用一次性从大量返回结果中只抽取少量数据,可以用分页把结果分成很多页, 每一页包含一小部分数据,抽取某一页数据去处理就行。
目前,支持分页的有维度和数据访问接口(endpoints)。
每一页除了实际数据,还包含分页参数。维度和数据接口的分页参数目前有所不同,不过我们正在修改维度数据接口,使之和数据接口显示相同的 参数。
如果需要将支持分页的资源进行分页显示,有两个查询参数可供您使用:
perPage:页面显示多少条数据结果/资源。参数值是正整数。
page: 显示第几页(页面显示多少条结果由 perPage 指定)。参数值是正整数。
举例,利用这两个参数,我们可以得到包含三条数据的第二页结果:
GET https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=2
所有格式的数据结果里,包含了一些链接。这些链接连到所有数据的第一页,最后一页,下一页,和上一页。四个页面用 rel 值区分开来,分别是
first,last,next,prev。上一个例子中,
的链接为:
 Link:
    https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=1; rel="first",
    https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=3; rel="last"
    https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=3; rel="next",
    https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=1; rel="prev",
维度和数据 API 接口却有不同之处:
JSON (and JSON-API) 数据格式里,返回的结果(response body)包含了一个 meta object:
"meta": {
    "pagination": {
        "currentPage": 2,
        "rowsPerPage": 3,
        "numberOfResults": 7
        "first": "https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=1",
        "previous": "https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=1",
        "next": "https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=3",
        "last": "https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews&dateTime=2014-09-01/2014-09-08&perPage=3&page=3"
    }
}
meta object 包含一个 pagination object,里面放了 first,last,next,previous 的链接。meta object 还包括了其它
信息:
currentPage: 第几页rowsPerPage :页面显示了多少条结果numberOfResults:所有页面包含的结果条数注意:要访问数据接口,必须同时提供 perPage 和 page 参数。数据接口不提供默认分页参数。
分页情况下, first 和 last 都会显示出来,但是 next 和 previous 只有在当前页之前或之后多出一页的情况下才会出现在返回结果
中。换句话说,第一页
没有 previous 的链接,最后一页
没有 next 的链接。
维度接口同样包含了first,last,next,prev 链接。
维度接口和数据接口不同之处在于,维度接口 永远会 分页。默认显示第一页,每页 10000 条数据。每页的数据条数可以修改,用配置变量
default_per_page 调节。
注意,default_per_page 只适用于维度接口,对数据接口不起作用。
perPage:
  如果只提供 perPage 参数,访问会失败
Example: GET https://sampleapp.fili.io/v1/dimensions/productRegion/values?perPage=2
注意:这个请求会得到一个报错结果,因为分页要求同时提供perPage 和 page
page:
  page 的默认值是 1,也就是第一页。
注意: page 和 perPage 必须同时设定。
Example: GET https://sampleapp.fili.io/v1/dimensions/productRegion/values?perPage=2&page=2
部分访问资源支持多种数据格式。默认的格式是 JSON,某些资源也支持 CSV 和 JSON-API 格式。
如果需要改变数据格式,请在查询语句中加入 format 变量。
JSON: GET https://sampleapp.fili.io/v1/data/network/day/gender?metrics=pageViews&dateTime=2014-09-01/2014-09-02&format=json
{
    "rows": [
        {
            "dateTime": "2014-09-01 00:00:00.000",
            "gender|id": "-1",
            "gender|desc": "Unknown",
            "pageViews": 1681441753
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender|id": "f",
            "gender|desc": "Female",
            "pageViews": 958894425
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender|id": "m",
            "gender|desc": "Male",
            "pageViews": 1304365910
        }
    ]
}
CSV: GET https://sampleapp.fili.io/v1/data/network/day/gender?metrics=pageViews&dateTime=2014-09-01/2014-09-02&format=csv
dateTime,gender|id,gender|desc,pageViews
2014-09-01 00:00:00.000,-1,Unknown,1681441753
2014-09-01 00:00:00.000,f,Female,958894425
2014-09-01 00:00:00.000,m,Male,1304365910
JSON-API: GET https://sampleapp.fili.io/v1/data/network/day/gender?metrics=pageViews&dateTime=2014-09-01/2014-09-02&format=jsonapi
{
    "rows": [
        {
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "-1",
            "pageViews": 1681441753
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "f",
            "pageViews": 958894425
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "m",
            "pageViews": 1304365910
        }
    ],
    "gender": [
        {
            "id": "-1",
            "desc": "Unknown"
        },{
            "id": "f",
            "desc": "Female"
        },{
            "id": "m",
            "desc": "Male"
        }
    ]
}
您可以根据维度值去筛选数据。不同的资源有不同的筛选结果,但是筛选的基本用法和原理都是一样的。
单个筛选的一般格式是:
dimensionName|dimensionField-filterOperation[some,list,of,url,encoded,filter,strings]
多个筛选项用逗号隔开,筛选采用 URL 编码,筛选值用逗号隔开:
myDim|id-contains[foo,bar],myDim|id-notin[baz],yourDim|desc-startsWith[Once%20upon%20a%20time,in%20a%20galaxy]
以下是可供使用的筛选项(某些项只能用于部分接口):
In 筛选是一个完全匹配项,只有在筛选项里列出的值列才会被选中Not In 筛选也是一个完全匹配项,只有_没有_在筛选项里列出的值列才会被选中Contains 筛选出值包含在指令内容中的数据,类似于 in 筛选Starts With 筛选出值以指定内容起始的数据,类似于 in 筛选举个例子解释一下。
| [比如](https://sampleapp.fili.io/v1/dimensions/productRegion/values?filters=productRegion | id-notin[Americas%20Region,Europe%20Region],productRegion | desc-contains[Region]): | 
GET https://sampleapp.fili.io/v1/dimensions/productRegion/values?filters=productRegion|id-notin[Americas%20Region,Europe%20Region],productRegion|desc-contains[Region]
这个筛选的含义是:
返回满足以下要求的维度值:
    不包含
        ID是 "Americas Region" 或 "Europe Region" 的 productRegion 维度值
    包含
        描述语句包含 "Region" 单词的 productRegion 维度值
Having 语句可以根据聚合数据条件来筛选返回数据。这和根据维度值过滤的筛选不尽相同,因此,描述 having 语句的语法与 之类似。
单个 having 语句的一般格式为:
metricName-operator[x,y,z]
这里的三个参数 x, y, z 可以是整数,小数(3, 3.14159)或者用科学计数法表示的数字(4e8)。实际情况下参数列可以包含任意
数量的参数,但参数列不能为空。
多个 Having 语句用逗号隔开:
metricName1-greaterThan[w,x],metricName2-equals[y],metricName3-notLessThan[y, z]
该语句的含义是_返回所有 metricName1 的值大于 w 或者 x,metricName2 的值等于 y,metricName3 的值大于 y 和 z 的所有数据列_。
注意,你只能将 having 语句用于出现在 metrics 语句中的数据。
以下是所有 having 的运算符。每一个运算符有一个简写形式,简写形式在每一个运算符完整名称后的括号内列出,你可以在查询语句 中选择全名或者简写。
Equal 返回对应的数据值至少等于某一个指定值的数据行。Greater Than 返回对应的数据值至少大于某一个指定值的数据行。Less Than 返回对应的数据值至少小于某一个指定值的数据行。每个运算符可以在前面加上一个 not,执行相反的操作。所以 noteq 返回对应的数据值不等于任何一个指定值的数据行。
举个例子来具体解释。
GET https://sampleapp.fili.io/v1/data/network/day?metrics=pageViews,users&dateTime=2014-09-01/2014-09-08&having=pageViews-notgt[4e9],users-lt[1e8]
此 having 语句的意思是:
返回 2014 年九月一号到八号,每天满足以下条件的页面访问量和访问者数量
    最多四亿次页面访问
    大于1亿访问者
having 筛选发生在 Druid 数据库,所以,如果 Fili 在 Druid 数据上对被筛选的度量进行任何后续计算,数据可能出现偏差。
查询的返回结果默认包含关于访问维度的 ID 和描述。但是您可能需要获取关于这些维度更多的信息,或者您不许要这么多信息,那么您可以
在维度路径后使用一个 show 语句:
GET https://sampleapp.fili.io/v1/data/network/week/productRegion;show=desc/userCountry;show=id,regionId/?metrics=pageViews&dateTime=2014-09-01/2014-09-08
这条查询的结果中只会显示产品区域维度(Product Region dimension)中的描述值域(description field)和用户国家维度
(User Country dimension)中的 ID 和 区域 ID值域。使用 show 的一般方法是,在维度后面加一个分号,在分号后面加入 show 语句 -
show=<fieldnames>。用逗号分隔一个 show 语句中的多个值域:
/<dimension>;show=<field>,<field>,<field>
用 show 选择值域的时候可以使用一些关键词:
none 关键词还能将尽量缩小返回的数据量大小,简化返回的数据。简化方式去取决于返回的数据格式:
非简化的返回数据里,每一个值域的格式是 "dimensionName|fieldName":"fieldValue",而简化后的只有一项值域,该值域的值是 key 值域
的值:"dimensionName":"keyFieldValue"。例如,非简化的返回数据如下
{
    "rows": [
        {
            "dateTime": "2014-09-01 00:00:00.000",
            "gender|id": "-1",
            "gender|desc": "Unknown",
            "pageViews": 1681441753
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender|id": "f",
            "gender|desc": "Female",
            "pageViews": 958894425
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender|id": "m",
            "gender|desc": "Male",
            "pageViews": 1304365910
        }
    ]
}
而带了 show=none,简化后的结果如下
{
    "rows": [
        {
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "-1",
            "pageViews": 1681441753
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "f",
            "pageViews": 958894425
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "m",
            "pageViews": 1304365910
        }
    ]
}
我们可以看到,gender|desc 消失了, gender|id 则变成了 gender。
非简化的返回数据 header 里,每一个值域的格式是 "dimensionName|fieldName":"fieldValue",而简化后的只有一项值域,该值域的
值是 key 值域的值。
none 关键词如果用到这个维度,sidecar object 就不会显示。例如
{
    "rows": [
        {
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "-1",
            "pageViews": 1681441753
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "f",
            "pageViews": 958894425
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "m",
            "pageViews": 1304365910
        }
    ],
    "gender": [
        {
            "id": "-1",
            "desc": "Unknown"
        },{
            "id": "f",
            "desc": "Female"
        },{
            "id": "m",
            "desc": "Male"
        }
    ]
}
简化之后变成
{
    "rows": [
        {
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "-1",
            "pageViews": 1681441753
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "f",
            "pageViews": 958894425
        },{
            "dateTime": "2014-09-01 00:00:00.000",
            "gender": "m",
            "pageViews": 1304365910
        }
    ],
    "gender": [ ]
}
返回数据的排序可以用 sort 查询参数实现,
例如:
sort=myMetric
排序默认是 降序排序,但 Fili 也支持升序排序。要指定度量的排序方向,您需要同时指定需要被排序的度量和排序方向,用 | 隔开,例如:
sort=myMetric|asc
如果要对多个度量进行不同方向的排序,用逗号讲每一个排序隔开:
sort=metric1|asc,metric2|desc,metric3|desc
使用排序需要注意以下几点:
dateTime)排序,然后才会按照查询中指定的进行排序,所以数据总是显示一定是按照时间先后的假如我们需要知道 2014 年一月到九月之间,每个星期访问量居前三的网页,我们可以用 topN 语句快速得到答案。topN 计算每一个时间段
(time bucket)的 top 数据,每一次访问最多可以得到 n 个 top 结果。不难想到, topN 需要数据被排序,所以,每个 topN 查询包含
两个过程
topN=n,n 是每个时间段 top 的个数sort=metricName|desc 指定 Fili 在筛选 top N 之前如何排序数据。关于排序的语句详解,请参见排序部分用这个部分开头的问题,我们来看看如何用 Fili 查询语句 来解决
GET https://sampleapp.fili.io/v1/data/network/week/pages?metrics=pageViews&dateTime=2014-06-01/2014-08-31&topN=3&sort=pageViews|desc
我们需要每星期排名前三的网页访问量,所以 n 是 3,精度是 week。而且,我们要的是三个 最大的 页访问量,所以我们把 pageViews 用
降序排列(第一条数据最大,第二条第二大,以此类推)。
Fili 在 topN 的数据基础上,还允许加入其他度量一并查询。比如我们想知道
一月刘六号到九月一号之间,每星期页访问量排名前三网页的日均访问时间,
我们只需要在原来的 topN 查询语句中添加 dayAvgTimeSpent:
GET https://sampleapp.fili.io/v1/data/network/week/pages?metrics=pageViews,dayAvgTimeSpent&dateTime=2014-06-01/2014-08-31&topN=3&sort=pageViews|desc
当 topN 语句里包含多个度量时,Fili 只会 用已经排好序的度量进行 top N 计算。
因为 topN 给出的是 每一个时间精度范围(each time bucket) 的 top N 结果,所以 topN 会给出 n * Bucket数量 条数据。在
以上两个例子里,我们会得到 3 * 34 = 102 条数据(二零一六年一月六号到九月一号之间有 34 个星期)。如果你只需要前 n 条数据,请
 参见分页部分。
Fili 支持数据异步查询(Asynchronous Queries)。数据接口的实现使用了 asyncAfter 参数。asyncAfter 参数可以决定一个数据访问
是否永远是同步的(synchronous)还是可以在数据查询过程中从同步切换成异步。如果 asyncAfter=never,那么 Fili 会无限期地等待
数据,在网络允许的情况下和 client 一直保持连接。这是默认配置。但是这个配置可以用 default_asyncAfter 配置参数修改。如果
asyncAfter=always,查询语句从一开始就会使异步的。如果 asyncAfter=t(t 代表一个正整数),那么在查询变成异步之前至少需要等待
t 毫秒。这个等待时间不是百分之百精确的。查询语句可能会花费比 t 毫秒更长的时间,这段时间里一直会是同步查询。所以说,
asyncAfter=0 和 asyncAfter=always 不完全一样。有可能 asyncAfter=0 最终会是一个同步查询(如果数据结果返回得够快的话)。但
如果是 asyncAfter=always,那么查询最终绝对不会是一个同步查询。
如果查询超时,数据仍然没有出来,那么访问者会收到一个 202 Accepted 响应和一个任务元数据(job meta-data)。
任务接口(jobs endpoint)is the one stop shop for queries about asynchronous jobs. This endpoint is responsible for:
用户可以向 jobs 接口发送一个 GET 请求,获取所有任务的状态。
https://HOST:PORT/v1/jobs
如果系统没有正在进行的任务,会返回一个空集。
jobs 接口支持筛选任务值域(job fields, i.e. userId, status),使用方法和数据接口的筛选相同。例如:
userId-eq[greg, joan], status-eq[success]
转换成如下 boolean 运算:
(userId = greg OR userId = joan) AND status = success
最后会返回由 greg 和 joan 发送的,已经顺利完成的任务。
当用户向 jobs/TICKET 发送一个 GET 请求时,Fili 会搜寻指定的 ticket 并返回任务的元数据(job’s meta-data)如下:
{
    "query": "https://HOST:PORT/v1/data/QUERY",
    "results": "https://HOST:PORT/v1/jobs/TICKET/results",
    "syncResults": "https://HOST:PORT/v1/jobs/TICKET/results?asyncAfter=never",
    "self": "https://HOST:PORT/v1/jobs/TICKET",
    "status": ONE OF ["pending", "success", "error"],
    "jobTicket": "TICKET",
    "dateCreated": "ISO 8601 DATETIME",
    "dateUpdated": "ISO 8601 DATETIME",
    "userId": "Foo"
}
query 是用户的查询语句results 是数据结果的链接,这个链接可以是完全同步的或者由同步超时后最终切换成异步的,取决于 asyncAfter 的默认配置。syncResults 是一个数据结果的异步链接(因为最后有 asyncAfter=never 参数)self 是一个显示最新任务状态的链接status 显示当前结果状态
    pending - 任务还在进行中success - 任务顺利结束error - 任务报错失败canceled - 用户终止了任务(开发中)jobTicket 这个任务的 IDdateCreated 任务创建日期dateUpdated 任务上次更新日期userId 提交这次任务的用户 ID如果 ticket 在系统中不存在,会得到一个 404 报错,显示 No job found with job ticket TICKET。
用户可以给 jobs/TICKET/results 发送 GET 请求,获取某次查询的结果。这个接口需要下列参数:
格式(format) - 用户可以指定返回数据的格式: csv 或者 JSON。这和数据接口的格式(format) 的用法是
 一样的。
page, perPage - 分页 参数。 用法和访问数据接口一样,都是得到某页结果。
asyncAfter - 指定用户的最长等待结果的时间。用法和数据接口的asyncAfter参数一样。
如果 ticket 出结果了,我们就会得到指定格式显示的结果,否则的话,得到任务元数据(job meta-data)。
如果访问希望用长轮询(Long Polling)的方式获取结果,可以发送 GET 请求到
https://HOST:PORT/v1/jobs/TICKET/results?asyncAfter=never(这实际上就是上面 syncResults 代表的链)。该请求会以同步请求的
方式发送:Fili 只有在所有数据计算好之后才会往回传结果。
时间段用 dateTime 参数表示,格式是 dateTime=d1/d2。 d1/d2 里面 d1 是起始时间,d2 是不包含在内的终止时间。例如,
dateTime=2015-10-01/2015-10-03 包含了十月一号,十月二号的数据,不包含十月三号的数据。日期可以是:
我们的 API 遵照 ISO 8601 标准。如果您想深入了解,维基百科上面有相关文章具体解释 ISO 8601 日期和时间。
日期区间(Date Periods),即 ISO 8601 时间区间,完全遵照 ISO 8601 standard 标准实现。表示方式很
简单,一个区间(period)以 P 开头,后面跟一个数字,然后一个时间精度(M为月份,W为星期,D为某日,以此类推)。举例,如果您需要 30
天的数据,就用 P30D。区间可以重复叠加,例如, P1Y2M 代表一年零两个月。
日期区间可以放在查询语句的起始或者终止日期处。
我们提供一个叫做 current 的宏(macro),表示当前精度下的起始时间。例如,如果您的时间就精度是day,那么 current 就会转换成
今天的日期。如果您的精度是 month,那么 current 就会转换成本月第一天。
还有一个功能类似的宏叫做 next,表示当前精度下的下一个起始时间。例如,如果你的精度是 day,那么 next 会转换成明天。
时区暂时不能用在时间段的起始或者终止时间。不过查询语查询的时区可以用 timeZone 查询参数修改。这会改变时间段里面日期时间
(dateTime)所处的时区。查询语句会自动使用默认的时区参数,而任何
时区识别符可以去覆盖这个默认值。例如,以下查询参数
dateTime=2016-09-16/2016-09-17&timeZone=America/Los_Angeles
vs
dateTime=2016-09-16/2016-09-17&timeZone=America/Chicago
会生成如下时间段
2016-09-16 00:00:00-07:00/2016-09-17 00:00:00-07:00
and
2016-09-16 00:00:00-05:00/2016-09-17 00:00:00-05:00
注意两个时间段的不同时差
API 的所有语法都是区分大小写的(case-sensitive),例如,pageViews,pageviews,PaGeViEwS 都是有区别的。
为了防止他人破坏系统,API 限定用户在某一时间段内只能发送一定量的请求。如果您发请求过快,就会收到报错回复,状态码(response status code)为 429。
使用 API 时候难免遇到报错情况,报错都会返回一个报错状态码,大多都还带有额外报错信息。
| 状态码 | 含义 | 起因 | 
|---|---|---|
| 400 | BAD REQUEST | 您的请求有语法错误。Fili 没法读懂您请求。 | 
| 401 | UNAUTHORIZED | Fili 无法识别您的身份,下次发送请求的时候请附上身份信息。这通常是因为您的请求里缺失安全验证信息 | 
| 403 | FORBIDDEN | Fili 可以识别您的身份,但是您没有足够权限访问某些资源 | 
| 404 | NOT FOUND | 找不到访问的资源,请求 URL 可能有拼写错误 | 
| 416 | REQUESTED RANGE NOT SATISFIABLE | 数据无法在 Druid 里头找到 | 
| 422 | UNPROCESSABLE ENTITY | 请求无语法错误,但是其它地方出错了,可能是维度没有匹配上,或者某个度量+维度组合在 API 列表(logical table)里不支持。 | 
| 429 | TOO MANY REQUESTS | 访问超过速率限制。稍等片刻,等您的其他请求完成处理了以后在发新请求 | 
| 500 | INTERNAL SERVER ERROR | 服务器内部处理过程中出错了,我们竭尽全力减少这些情况的发生,但是若有遗漏,您要是收到了 500 报错,请告诉我们。 | 
| 502 | BAD GATEWAY | Druid 故障响应(Bad Druid response)。 | 
| 503 | SERVICE UNAVAILABLE | Druid 宕机了。 | 
| 504 | GATEWAY TIMEOUT | Druid 访问超时。 | 
| 507 | INSUFFICIENT STORAGE | 查询耗费太多资源了 |