繁体   English   中英

在多维数据集的 SQL 定义中使用上下文变量时,Cube.js 是否支持 preAggregations?

[英]Does Cube.js support preAggregations when using Context Variables inside the SQL definition of a cube?

根据Cube.js 文档,可以使用称为上下文变量的东西来定义多维数据集,这允许在查询该多维数据集时注入过滤器(例如特定用户的电子邮件)。 我还没有尝试过,但我想知道此功能是否与预聚合兼容,以及它是否处理空过滤器情况。
例如,如果我定义这个多维数据集(与文档中的示例相同):

    cube(`OrderFacts`, {
      sql: `SELECT * FROM orders WHERE ${FILTER_PARAMS.OrderFacts.date.filter('date')}`,

      measures: {
        count: {
          type: `count`
        }
      },

      dimensions: {
        date: {
          sql: `date`,
          type: `time`
        }
      }
    });

我能定义这样的 preAggregation 吗?

  preAggregations: {
    date: {
      type: `rollup`,
      measureReferences: [someMeasure],
      dimensionReferences: [someDimension],
      timeDimensionReference: date,
      granularity: `month`
    }
  }

我可以在没有date维度过滤器的情况下执行查询吗? (所以sql将以SELECT * FROM orders WHERE;结尾)?

总结一下:有没有一种方法可以动态地将过滤器注入多维数据集的sql定义,但不是在查询时而是在模式编译时
我问这个是因为我们目前正在使用从我们的 API 检索到的信息扩展一些多维数据集,并且我们正在从这个多维数据集中覆盖segment字段,但是由于性能问题,我们更愿意覆盖多维数据集的sql字段(从一开始就过滤不必要的数据) )。

注意:我们使用asyncModule来执行对 API 的查询。 我们还需要构建不同的多维数据集(为我们所有的客户)引用一个公用表,但使用将根据客户而改变的动态 SQL。

我们想要的输出应该是(对于来自我们 API 的 Orders 表和F1 , ..., Fn客户端过滤器):
扩展基本Orders多维数据集的 N 个多维数据集: OrdersC1OrdersC2 、 ...、 OrdersCn
每个OrdersCi多维数据集都带有基本Orders sql 的修改版本,包含其Fi过滤器。
每个OrdersCi多维数据集具有相同的dimensionsmeasurespreAggregations定义,继承自基本Orders多维数据集。

我们设法实现了我之前所说的所有内容,但是我们没有修改sql字段,而是覆盖了segments字段。

一般来说,只有分区汇总才能通过FILTER_PARAMS来获取分区时间维度。 所有其他预聚合都不允许传递上下文变量。 您可以使用两种方法在多租户环境中利用预聚合。

  1. 为每个客户多维数据集(例如OrdersC1OrdersC2等)覆盖sql 。在这种情况下,基本Orders多维数据集中定义的所有预聚合都将被继承。 每个客户多维数据集都有自己的一组预聚合。 这意味着如果有N客户和M预聚合,那么应该构建N * M预聚合表,这在某些情况下可能会很昂贵。
cube(`Orders`, {
  sql: `SELECT * FROM orders`,

  preAggregations: {
    date: {
      type: `rollup`,
      measureReferences: [someMeasure],
      dimensionReferences: [someDimension],
      timeDimensionReference: date,
      granularity: `month`
    },
    // ...
  }
});

cube(`OrdersC1`, {
  extends: Orders,
  sql: `SELECT * FROM orders WHERE customer_id = 'C1'`,
});
  1. 使用租户字段作为汇总维度。 每个段都可以转换为维度,这提供了为所有客户使用单个汇总表的机会。 可以使用queryTransformer将请求路由到正确的租户数据。
cube(`Orders`, {
  sql: `SELECT * FROM orders`,

  // ...

  dimensions: {
    // ...

    customerId: {
      sql: `customer_id`,
      type: `string`
    }
  },

  preAggregations: {
    date: {
      type: `rollup`,
      measureReferences: [someMeasure],
      dimensionReferences: [customerId, someDimension],
      timeDimensionReference: date,
      granularity: `month`
    },

    // ...
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM