【问题标题】:OLAP Approach for Backend redshift connection后端红移连接的 OLAP 方法
【发布时间】:2017-11-17 00:24:11
【问题描述】:

我们有一个系统,可以根据某些条件在 Redshift 中进行一些聚合。我们通过复杂的连接汇总这些数据,通常需要大约 10-15 分钟才能完成。然后,我们在 Tableau 上显示这些汇总数据以生成我们的报告。 最近,我们在添加新维度(通常需要与新表连接)或获取一些更具体的过滤器上的数据方面进行了许多更改。为了满足这些请求,我们必须每次为每个子流程更改查询。 我稍微经历了 OLAP。我只是想知道它在我们的用例中是否会更好,或者有没有更好的方法来设计我们的系统来处理不需要开发人员每次都更改的临时请求。

提前感谢您的建议。

【问题讨论】:

    标签: amazon-redshift tableau-api olap


    【解决方案1】:

    它会起作用,而是它应该起作用。效率是这里的关键。您需要严格监控的事项很少,以确保您的系统(Redshift + Tableau)保持正常运行。

    比实时连接更喜欢数据提取(在 Tableau 中)

    每当有人更改过滤器或刷新报告时,实时连接都会查询系统。由于您说数据集很大并且查询很复杂,因此更喜欢创建数据提取。这将确保无论何时有人访问您的仪表板,数据都是可用的。不要忘记安排数据提取刷新,否则数据将永远过时。

    编写高效的查询

    OLAP 系统需要查询大型数据集。确保编写有效的查询。最好先获取一个小数据集并加入它们,而不是将所有内容都放入内存然后加入/使用where 子句过滤结果。

    (select foo from table1 where ... )a left join (select bar from table2 where) 这样的查询有时可能是关键,有时您只取出少量相关数据然后加入。

    不要查询无限数据。

    由于这是分析数据而非事务数据,因此对 Tableau 将刷新的数据设置上限。历史数据很重要,但不是从您的产品开始时开始。分析过去 3、6 或 9 个月的数据可能是关键,而不是查询通用数据集。

    创建聚合并让 Tableau 查询该表,而不是原始表

    假设您正在分析用户特征。与其查询每个用户每天捕获 100 条记录的原始表,不如设计一个每个用户每天只有一个(或两个)条目的表并引入一列 - count,它将告诉您事件的次数已被触发。通过这样做,您将查询足够小的数据集,但在逻辑上与您之前所做的相同。

    正如Mr Prashant Momaya所提到的,

    "While dealing with extracts,your storage requires (size)^2 of space if your dashboard refers to a data of size - **size**"
    

    对您实施的任何设计都非常谨慎,不要忘记考虑最重要的因素 - 可扩展性

    【讨论】:

    • 嘿,我已经在 Tableau 中遵循提取格式,并且也在编写高效的查询。你能给我一些关于 OLAP 的参考,以满足我的用例吗?
    【解决方案2】:

    这是一个典型的问题,我们通过用 Python 编写 SQL 生成器来解决它。如果指标的定义相同(如count(*)),但您有不同的维度和过滤器,您可以将其声明为 JSON 并编写生成 SQL 的生成器。浏览量示例:

    {
        metric: "unique pageviews"
       ,definition: "count(distinct cookie_id)"
       ,source: "public.pageviews"
       ,tscol: "timestamp"
       ,dimensions: [
            ['day']
           ,['day','country']
    }
    

    可以相对容易地翻译成 2 个脚本 - 这个:

     drop table metrics_daily.pageviews;
     create table metrics_daily.pageviews as
     select 
      date_trunc('day',"timestamp") as date
     ,count(distinct cookie_id) as "unique_pageviews"
     from public.pageviews
     group by 1;
    

    还有这个:

     drop table metrics_daily.pageviews_by_country;
     create table metrics_daily.pageviews_by_country as
     select 
      date_trunc('day',"timestamp") as date
     ,country
     ,count(distinct cookie_id) as "unique_pageviews"
     from public.pageviews
     group by 1,2;
    

    从这样的配置生成这样的 sql 所需的生成器的复杂性非常低,但随着您需要添加新的连接等而呈指数增长。最好将维度保持在编码形式并只使用单个宽表作为聚合源,或者为您可能需要的每个连接生成视图并将它们用作源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2022-01-16
      • 2016-06-12
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多