Skip to content

API 数据源 ​

当用户使用 EXT API 数据时,可以通过 API 数据源将数据接入到衡石系统。 API 数据源定义统一的数据接入规范,能支持大量的无数据计算能力的 API 数据源。内置多种 API 数据源的同时支持用户自定义开发方式加入企业内部 API 数据源或其他公有 API 数据源,快速读取 API 数据源。API 数据源轻松实现接入外部 API 数据由1到 N 的快速增长,增强衡石数据的整合能力。

内置 API 数据源 ​

明道云数据源 ​

用户在明道云上的应用数据通过简单的配置就可以连接到衡石系统。配置步骤如下:

  1. 在新建数据连接中选择 API 数据源。

  2. 输入新建连接名称、选择数据网关、API name 选择'mingdaoyun'。

  3. 填写明道云配置信息 API Config,包括 appKey、secretKey、sign apiUrl。 其中 appKey、secretKey、sign 指的是明道云应用中的 AppKey、SecretKey、Sign。明道云为私有部署时,apiUrl 请填写私有部署地址;公有部署时 apiUrl 可置空或填写默认地址。

    json
    {
     "appKey":"ab1a55ba2deb3a01",
     "secretKey":"68b7eqbp7r1p5ZeAbw60aXcG0h8G354qfB4waK198G5M7w9y92eP3Dae27emcu7n",
     "sign":"NWRiODkxZmQ0NzljNzcxZDhiMDZjMzE5ZDQzMDFlMWFiNDU0MGViYTI1NjFlNDUyMmNjMmQzMWMzMmM2YzBlZQ==",
     "apiUrl": "https://api.mingdao.com/v2/open"
    }
  4. 验证成功后,点击保存,数据连接创建完成。在系统中可以查看和使用明道云中的数据。

FTP 数据源 ​

系统支持 FTP 数据源,在 HENGSHI SENSE 中通过简单配置,可以读取 ftp 指定路径下的文件。 配置步骤如下。

  1. 在新建数据连接中选择 API 数据源。
  2. 输入新建连接名称、选择数据网关、API name 选择'ftp',填写 ftp 配置信息,将 host、username、password、directory、encoding、passive 等信息填入到配置中。
    json
    {
     "host":"10.10.10.86",
     "username":"anonymous",
     "password":"anonymous",
     "directory":"/",
     "encoding":"utf8",
     "passive":true,
    }
  3. 验证成功后,点击保存,数据连接创建完成。在系统中可以查看和使用连接数据。

提示

FTP 数据源只能将 csv 和 excel 解析为表的形式,其他类型的文件不支持解析。

其他内置数据源 ​

除了上述 FTP 和明道云外,系统还支持 S3、旺店通、企业微信、石墨文档、聚水潭、易仓科技、外勤等 API 数据源,用户配置 API config 后,即可将数据接入到衡石系统中。

自定义 API 数据源 ​

除了内置的 API 数据源外,系统支持用户自定义 API 数据源,可以使用以下两种方法自定义 API 数据源。

  • 自定义 API 数据源为内置数据源
  • 系统直接接入自定义 API 数据源

自定义 API 数据源为内置数据源 ​

自定义 API 数据源为内置数据源,是指将自定义 API 数据源的 Groovy 脚本载入到衡石系统中,系统启动会自动载入脚本中定义的数据源。 用户可以在下拉框中找到自定义的 API 数据源,其使用方法与内置 API 数据源一样。

自定义 API 数据源载入系统 ​

按照规范编写自定义 API 数据源的 Groovy 脚本,通过环境变量 EXT_API_PATH 指定脚本位置,然后重启系统。

export EXT_API_PATH=/opt/hengshi/ext_api_files

系统在启动过程中会自动扫描 EXT_API_PATH 指定的路径下所有数据源定义文件(以.groovy 后缀结尾的文件),并且加载到 API 数据源中。在 API 数据源创建时就能看到相应的数据源了,使用时与内置数据源使用方法一样。

API 数据源接入规范 ​

自定义数据源接入时,需要在 Groovy 脚本中实现下面四个接口。

  • getAPIName : 用来获取 API 名称。
  • setOptions:用来处理认证鉴权相关配置信息。
  • fetchPathTables:用户获取数据源目录结构。
  • fetchTableData : 用于获取 table 节点数据。
函数 getAPIName ​

函数 getAPIName 的作用是输出 API 名称。该名称会出现在页面的 API Name 下拉选择框中。 每一个 API 数据源名称不能相同,如果相同会导致发生冲突。 该函数是类 static 函数,返回值为 string 类型的字符串。

groovy
static getApiName() {
        return "TrivalApiDemo"
    }

函数 setOptions ​

函数 setOptions 的作用是用来保存处理认证鉴权相关的配置信息。 如果不涉及外部网络请求,可以直接留空了。 该函数是 object 函数, 函数参数是一个 JSON 字符串,这个字符串是用户在添加数据连接时填写的信息。

groovy
    def setOptions(String options) {
        if (!options?.trim()) {
            return
        }
        def json = jsonSlurper.parseText(options)
        if (json.cityCodeURL?.trim()) {
            config.cityCodeURL = JSON.cityCodeURL
        }
        if (json.weatherURL?.trim()) {
            config.weatherURL = JSON.weatherURL
        }
    }
函数 getPathTables ​

函数 getPathTables 的作用是返回目录树,把该数据源的所有 catalog/schema/table 的结构都返回。 代码示例如下。

groovy

def getPathTables() {
        def tableTree = [
            [pathType: "table", name: "table1", tableType: "table"],
            [pathType: "path", name: "schema2", children: [
                    [pathType: "table", name: "table3", tableType: "view"],
                    [pathType: "table", name: "table4", tableType: "table", remarks: "表别名4"]
            ]]
        ]
        return new JsonBuilder(tableTree).toString()
    }

结构定义说明:

  • pathType 的种类有 table(代表叶子结点的表), path(代表数据库中的 schema 或者 catalog)
  • name 就是 表名或者 schema/catalog 的名字
  • tableType 只对 table 有意义,它的类型一般写成 table 就可以了(另外一个选项是 view,不常用)
  • 当 pathType 为 path 时,代表这个节点不是一个表,而是一个 schema 或者 catalog 这样的中间目录结构,此时它可以有 children 数组节点
  • remarks 是当前节点的一个说明,需要的时候可以提供,是可选项。

通过上面的函数定义的 schema, 可以在数据连接中查看如下的 table。

函数 fetchTableData ​

函数 fetchTableData 函数的作用是获取一个叶子节点,即 table 节点的数据。代码示例如下。

groovy
    def fetchTableData(List<String> tablePath) {
        def tableName = tablePath.last()
        def schemaData = [
                schema: [
                        [fieldName: "field1", label: "字段别名1", type: "string"],
                        [fieldName: "field2", label: null, type: "string"],
                        [fieldName: "field3", type: "number"],
                        [fieldName: "field4", type: "date"],
                        [fieldName: "field5", type: "time"]],
                data: [
                        ["a", "b", 10, "2022-01-01", "2022-01-01 23:59:59"],
                        ["c", "d", 20.20, "2019-12-39", "2019-12-39 23:59:59"]
                ]
        ]
        return new JsonBuilder(schemaData).toString()
    }

Schema 结构定义:

  • fieldName 字段名,需要在 table 内具有唯一性,能区分不同的字段。
  • type:字段的类型,常用的类型有:string, number, date, time, json, bool。
  • label:字段的别名。

Data 结构定义:

  • data 的每一个元素都是一个数组,数组的元素个数必须和 schema 相同,数据的类型也必须一一匹配。

通过上述示例,可以返回的数据如下。

API 数据源定义文件方式 ​

API 数据源定义文件方式有很多种,上面示例是使用 JSON 方式定义一个 API 数据源,这种方式简单,但是性能不高,当数据量较大时,可以使用 Java 方式。 下面使用 Java 构造一个天气 API 自定义数据源。weather.groovy 文件定义内容如下。

groovy
//Weather.groovy

import com.hengshi.nangaparbat.dto.DatasetResultDto
import com.hengshi.nangaparbat.model.PathTableNode
import static com.hengshi.nangaparbat.model.Dataset.Field
import static com.hengshi.nangaparbat.model.Type.TypeName
import groovy.json.JsonSlurper



class Provider {
    static getApiName() {
        return "天气 API"
    }

    def setOptions(String options) {
        if (!options?.trim()) {
            return
        }
        def json = jsonSlurper.parseText(options)
        if (json.cityCodeURL?.trim()) {
            config.cityCodeURL = json.cityCodeURL
        }
        if (json.weatherURL?.trim()) {
            config.weatherURL = json.weatherURL
        }
    }

    def getPathTables() {
        def txt = config.cityCodeURL.toURL().text
        def arr = jsonSlurper.parseText(txt)
        return arr.collect{ obj ->
            def node = PathTableNode.createTableNode(obj.city_code)
            node.setRemarks(obj.city_name)
            return node
        }
    }

    def fetchTableData(List<String> tablePath) {
        def url = config.weatherURL + tablePath.last()
        def txt = url.toURL().text;
        def result = new DatasetResultDto()
        def schema = []
        def data = []
        def row = []
        def arr = jsonSlurper.parseText(txt)
        arr.data.each{ k, v ->
            def field = new Field();
            field.setFieldName(k)
            field.setType(TypeName.string)
            if (k.startsWith("pm")) {
                field.setType(TypeName.integer)
            }
            schema.add(field)
            row.add(v);
        }
        result.setSchema(schema)
        data.add(row)
        result.setData(data)
        return result
    }


    def jsonSlurper = new JsonSlurper()

    def config = [
            cityCodeURL: "https://github.com/baichengzhou/weather.api/raw/master/src/main/resources/citycode-2019-08-23.json",
            weatherURL: "http://t.weather.itboy.net/api/weather/city/"
    ]
}

代码说明:

  • DatasetResultDto 定义了 fetchTableData 的返回结果,它由 schema 和 data 组成,通过 setData 和 setSchema 来写入。
  • PathTableNode 定义了 getPathTables 的返回,它由 pathType, name, children 和 tableType 组成,也是通过各自的 setter 来写入
  • schema 由多个 Field 组成,Field 由 fieldName, type 和 label 组成。
  • type 的种类是一个枚举类型定义的 TypeName。
  • CityCode中定义了目录结构。
  • 天气网站是天气数据来源,记录了各个城市的天气数据。

使用上述示例代码定义了天气 API 数据源,将 weather.groovy 导入系统后,获取 API 数据。

直接接入自定义 API 数据源 ​

系统可以直接接入自定义 API 数据源,如图所示,新建 API 数据源在 API name 中选择自定义,然后将自定义 API 数据源的 Groovy 脚本,存放到 Custom Script 中,点击验证,添加即可。

这种方式无须系统重启即可将自定义 API 数据源接入到系统中,操作比较方便。 但是每次新建数据连接时都需要输入 Custom Script。

衡石分析平台使用手册