cube.js的 data schema 类似graphql 的type 定义,但是cube.js 的data schema 更偏向于dsl, 
其中抽象了进行数据分析应用开发中的东西,自己提炼了measures , dimensions,cube

说明

  • cube 这个是用来进行实体,或者说是数据库表管理的
  • measures 说简单点就是聚合类的操作,但是这个是由cube.js 自动帮我们生成代码的,我们只需要定义
  • dimensions 实际上就是我们关注的详细数据列信息(一般体现为数据库表的定义信息)

一个简单例子

  • 定义schema
cube(`Users`, {
sql: `SELECT * FROM users`, measures: {
count: {
sql: `id`,
type: `count`
},
}, dimensions: {
city: {
sql: `city`,
type: `string`
}, companyName: {
sql: `company_name`,
type: `string`
}
}
});
  • 说明 
    生成sql 说明: 如果我们只需要一个cout 的measures ,生成的sql 如下:
SELECT count(id) from users;

如果我们需要应用city dimensions 到measures 生成的sql 如下:

SELECT city, count(id) from users GROUP BY 1;

measures 添加filter

  • 参考cube 定义
cube(`Users`, {
measures: {
count: {
sql: `id`,
type: `count`
}, payingCount: {
sql: `id`,
type: `count`,
filters: [
{ sql: `${CUBE}.paying = 'true'` }
]
}
}
});

以上schema 中引用了CUBE 常量,后边会有介绍

  • 说明 
    如果我们关注 payingCount measures 生成的sql 如下:
SELECT
count(
CASE WHEN (users.paying = 'true') THEN users.id END
) "users.paying_count"
FROM users

添加计算measures

  • 参考schema定义
cube(`Users`, {
measures: {
count: {
sql: `id`,
type: `count`
}, payingCount: {
sql: `id`,
type: `count`,
filters: [
{ sql: `${TABLE}.paying = 'true'` }
]
}, payingPercentage: {
sql: `100.0 * ${payingCount} / ${count}`,
type: `number`,
format: `percent`
}
}
});
  • 说明 
    如果我们请求 payingPercentage measures 生成的sql 如下
SELECT
100.0 * count(
CASE WHEN (users.paying = 'true') THEN users.id END
) / count(users.id) "users.paying_percentage"
FROM users

说明

从以上看出cube.js 的schema 目前还算够用,一些基本的已经有了,而且从设计上,是可以复用的,类似的有dbt一个不错的额 
etl t 工具

参考资料

https://cube.dev/docs/getting-started-cubejs-schema

cube.js 学习(三)cube.js data schema的更多相关文章

  1. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  2. Sea.js学习4——Sea.js的配置

    可以对 Sea.js 进行配置,让模块编写.开发调试更方便. seajs.config seajs.config(options) 用来进行配置的方法. seajs.config({ // 别名配置 ...

  3. JS学习三(函数)

    [函数的声明格式] 1.函数的声明格式: function 函数名(参数1,参数2,...){ 函数体代码 return 返回值: } 函数的调用: ① 直接调用:函数名(参数1的值,参数2的值,.. ...

  4. node.js学习三--------------------- http服务器模块的搭建

    /** * http服务器的搭建,相当于php中的Apache或者java中的tomcat服务器 */ // 导包 const http=require("http"); //创建 ...

  5. js 学习三 Array

    1.数组的长度 var sequence = [1, 1, 2, 3, 5, 8, 13]; sequence .length //7 2.字符串转换成数组 string.split() var my ...

  6. Node.js学习(Node.js基础)

    1.开发环境搭建 v8引擎是作为解析JavaScript程序来运行的 nodejs是一个高性能的,第一个体现在他的JavaScript解析速度很快,v8引擎性能很高,第二个事件驱动和非阻塞 2.全局对 ...

  7. Sea.js学习3——Sea.js的CMD 模块定义规范

    在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...

  8. Sea.js学习2——Sea.js的API 快速参考

    (7 个接口是最常用的) 一.seajs.config:用来对 Sea.js 进行配置. seajs.config({ // 设置路径,方便跨目录调用 paths: { 'arale': 'https ...

  9. [node.js学习]为node.js写的一个操作mysql的类

    不支持一个对象在不同异步中使用,模仿的php框架 speedphp中的model模块 GaryMysql.js var mysql = require('mysql'); var pool = nul ...

  10. Sea.js学习5——Sea.js的构建工具spm

    如果项目遵循推荐的标准目录结构: foo-module/ |-- dist 存放构建好的文件 |-- src 存放 js.css 等源码 | |-- foo.js | `-- style.css `- ...

随机推荐

  1. vue生成带logo的二维码

    输入命令行下载 npm install vue_qrcodes <template> <div> <qrcode :url="></qrcode&g ...

  2. MAC 添加Jmeter环境变量

    vim ./bash_profile JMETER_HOME=/Users/finup/apache-jmeter-5.1.1 CLASSPATH=$JAVA_HOME/lib/tools.jar:$ ...

  3. (二)Django自定义标签

    1.创建自定义标签 在项目的APP中新建一个Python Package-->blog_tags.py 代码: from django import template from ..models ...

  4. Docker学习笔记(一)—— 概述

    1. Docker是个什么玩意 说Docker是什么之前,先来看一看Docker为什么会出现.我们知道,在学习过程中我们需要频繁地安装配置一些软件,不管是在Windows下还是在Linux,这些东西的 ...

  5. 前后端API交互如何保证数据安全性

    前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提 ...

  6. C#连接数据库不安装Oracle客户端

    Oracle提供了这样的Oracle.ManagedDataAccess.dll,让用可以需要安装Oracle客户端即可连接数据库,并且不区分32位和64位. 1.引用 选择引用,找到对应文件目录下的 ...

  7. Oracle 11g安装过程工作Oracle数据库安装图解

    一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: oracle.com/tec ...

  8. gitlab用户登录与AD域用户集成

    ---恢复内容开始--- 编辑gitlab.rb文件 sudo vi /etc/gitlab/gitlab.rb 下图是我编辑的内容示例(仅供参考): 编辑以下内容: gitlab_rails['ld ...

  9. 提高QPS

    常用方案 1.异步化+MQ 即非阻塞,化繁为简,拿到你需要处理的资源后尽快回复.适用于事务处理场景,且无需对上游返回数据场景. 2.无锁设计 本质上是要降低锁冲突,基于数据版本的乐观锁 有效的减少了互 ...

  10. sqlite移植

    编译 # tar xvf sqlite-3.6.16.tar.gz # cd sqlite-3.6.16 # ./configure # ./configure --host=arm-linux -- ...