在本博客中,我将演示如何启用高性能查询,以便使用 Rockset 对 Redshift 进行交互式分析。我将演练在 Rockset 和 Redshift 表之间设置集成的步骤,并在该表上运行毫秒延迟 SQL,为交互式Tableau仪表板供电。

Amazon Redshift 等数据仓库服务非常适合为低并发工作负载运行复杂查询。它们可以轻松扩展到 PB 的数据,非常适合运行业务报告。现在,假设一个组织想要以交互式仪表板的形式操作 Redshift 中的数据,该仪表板允许用户在 Redshift 中交互式查询数据。有两个挑战:

  1. 此类交互式仪表板需要临时查询的毫秒查询延迟,而 Redshift 通常不支持此延迟。
  2. 如果仪表板同时由数十个用户使用,Redshift 无法支持此级别的并发查询,因为它不是为高 QPS 构建的。

为了解决这个问题,我们可以将”岩石集”连接到 Redshift,并针对 Rockset 而不是 Redshift 对操作仪表板问题进行查询。借助 Rockset,您可以连续导入位于 Amazon Redshift 群集中的数据,而无需任何 ETL,可以运行快速 SQL 并执行操作分析,而无需担心容量规划、群集大小调整或性能调优。

redshift4

红移

红移集成

每个 Amazon Redshift 群集可以有多个数据库、架构和表。每个表都需要在插入数据之前定义数据定义。Rockset 使连接 Redshift 群集和使用相同的权限集访问群集中的所有表变得容易。此外,您不需要提供任何数据架构来在 Rockset 中创建集合。Rockset 使用 Redshift 的卸载功能将数据暂装到与群集相同的区域中的 S3 存储桶中,然后从该 S3 存储桶中引入数据。Rockset 使用并行选项卸载数据以更快地暂载数据。

实时同步

Rockset 还允许用户在源 Redshift 表中指定时间戳字段,例如 last_updated_at 监视新更新。当源 Redshift 表持续更新时,同步延迟不超过几秒钟,而当源不常更新时,同步延迟不超过五分钟。这当前仅处理源表中的更新和新插入。对记录删除的支持即将推出。岩集需要源红移表具有主键。Redshift 表中的主键值用于构造 Rockset 中的_id字段,以唯一地标识岩石集集合中的文档。这可确保对 Redshift 表中的现有项的更新应用于 Rockset 中的相应文档。

将红移连接到岩石集

在本演示中,我在 Amazon Redshift 中加载了示例奥克兰呼叫中心数据,我将用它来创建下面的 Redshift 集成。这将使用 REQUESTID 作为红移中的主要键。此外,我还在源 Redshift 表中创建了名为”更新_at”的列,每当插入或更新记录时,该列都会将其设置为当前时间…
….
更新_在日期时间默认系统);

对于下面的步骤,我将使用摇滚控制台。您还可以通过在此处注册在 Rockset 中创建帐户。

创建红移集成

为了让 Rockset 访问 Redshift 群集,我将创建一个集成,具有访问它所需的所有权限。这包括与 Redshift 群集位于同一帐户和区域内的 S3 存储桶的 IAM 权限以及 Redshift 用户的数据库权限。有关详细信息,请参阅文档

redshift1

红移仪表板

创建岩集集合

设置红移集成后,我们就可以使用它来引入红移群集中的不同表。Rockset 在此步骤中需要数据库、架构和表名。

redshift2

创建集合

在此步骤中,将创建集合,并获取使用指定 Redshift 表中的数据进行更新。我们现在可以开始查询数据了。

在岩集中查询红移数据

Redshift 表中的每一行对应于 Rockset 集合中的一条记录。让我们描述它们,并查看集合中的所有字段。对于红移表中的日期时间类型字段,Rockset 将其存储为带有默认 UTC 时区的时间戳。

rockset> describe "oakland-call-center";
+---------------------+---------------+---------+-----------+
| field               | occurrences   | total   | type      |
|---------------------+---------------+---------+-----------|
| ['BEAT']            | 608949        | 608949  | string    |
| ['COUNCILDISTRICT'] | 608949        | 608949  | string    |
| ['City']            | 608949        | 608949  | string    |
| ['DATETIMECLOSED']  | 608949        | 608949  | string    |
| ['DATETIMEINIT']    | 608949        | 608949  | string    |
| ['DESCRIPTION']     | 608949        | 608949  | string    |
| ['PROBADDRESS']     | 608949        | 608949  | string    |
| ['REFERREDTO']      | 608949        | 608949  | string    |
| ['REQADDRESS']      | 608949        | 608949  | string    |
| ['REQCATEGORY']     | 608949        | 608949  | string    |
| ['REQUESTID']       | 608949        | 608949  | string    |
| ['SOURCE']          | 608949        | 608949  | string    |
| ['SRX']             | 608949        | 608949  | string    |
| ['SRY']             | 608949        | 608949  | string    |
| ['STATUS']          | 608949        | 608949  | string    |
| ['State']           | 608949        | 608949  | string    |
| ['updated_at']      | 608949        | 608949  | timestamp |
| ['_event_time']     | 608949        | 608949  | timestamp |
| ['_id']             | 608949        | 608949  | string    |
+---------------------+---------------+---------+-----------+

现在,让我们在此数据集上运行一些查询,以了解呼叫中心的操作。下面的第一个查询检查过去 3 天内不同来源的请求数rockset.com/tableau/”rel=”nofollow”目标\”\blank”_Tableau 我还绘制了此图表来分析趋势。

redshift3

按年份表示的记录数

大多数请求都通过SeeClickFix(用于引发请求的移动应用程序)进行。接下来,我们来检查有多少被取消了。(如果请求创建错误,则取消请求。应答客户呼叫的座席也会花时间在此类请求上,而大量此类请求可能是修复请求流中某些内容的良好指标。

rockset> select count(*) as cancelled_requests
       from "oakland-call-center"
       where STATUS = 'CANCEL'
          and SOURCE = 'SeeClickFix'
           and PARSE_DATETIME_ISO8601(DATETIMEINIT) > CURRENT_DATETIME() - DAYS(3);
+----------------------+
| cancelled_requests   |
|----------------------|
| 44                   |
+----------------------+

集合还会跟踪问题解决时间。让我们根据请求类型检查解决案例的平均天数。解决案例涉及外部因素,可用于深入了解其他团队需要很长时间才能解决的操作。

rockset> WITH sum_days as (
           select sum(EXTRACT(day from PARSE_DATETIME_ISO8601(o."DATETIMECLOSED") -
                      PARSE_DATETIME_ISO8601(o."DATETIMEINIT"))) as days, 
                      o."REQCATEGORY"
           from "oakland-call-center" o
           where o."DATETIMECLOSED" != '' and o."DATETIMEINIT" != ''
           GROUP BY o."SOURCE"
         ),
         sum_sources as (
           select o."REQCATEGORY", count(*) as count from "oakland-call-center" o           
           group by o.REQCATEGORY
         )
         select sum_days.REQCATEGORY, (sum_days.days / sum_sources.count) as avg_days
         from sum_days
         join sum_sources on sum_days.REQCATEGORY = sum_sources.REQCATEGORY

+----------------+------------+
| REQCATEGORY    | avg_days   |
|----------------+------------|
| WATERSHED      | 260        |
| METER_REPAIR   | 223        |
| VEGCONTR       | 150        |
| STREETSW       | 105        |
| ROW            | 99         |
| LAB            | 89         |
| GIS            | 81         |
| TREES          | 79         |
| BLDGMAINT      | 63         |
| PARKS          | 54         |
| SURVEY         | 52         |
| TRAFFIC_ENGIN  | 46         |
...................
...................
| DRAINAGE       | 13         |
| POLICE         | 11         |
| ELECTRICAL     | 10         |
| ROW_INSPECTORS | 8          |
| RECYCLING      | 8          |
| GRAFFITI       | 8          |
| ILLDUMP        | 3          |
| HE_CLEAN       | 2          |
| OTHER          | 1          |
| PARKING        | 0          |
+----------------+------------+

总结

我执行的查询只是操作仪表板通常需要的查询的子集。Rockset 支持 JOIN,因此您可以跨集合运行复杂的查询。我只需创建与 Rockset 的 Redshift 集成,并执行快速 SQL,无需调整任何 ETL 或群集大小。加载数据、查询集合和构建图表的整个过程大约需要几个小时。Rockset 使数据从业者能够轻松地跨不同的 Redshift 表甚至其他源引入和联接数据!

Comments are closed.