如何高效经济地从 API 中的 Snowflake Table 获取细分数据?

时间:2021-04-20 11:56:45

标签: sql api rest snowflake-cloud-data-platform data-warehouse

我正在为我的公司开展一个细分项目,我们必须创建一个管道来从我们的应用用户那里收集数据,当他们适合细分时,应用将接收该信息并对其进行处理(而不是在我的范围)。因此,目前,客户端连接并验证一个端点,该端点允许其客户端将 JSON 数据发送到 Elasticsearch 集群(应用程序已启动、级别已完成等)。然后我使用 Azure 函数每 5 分钟获取一次实时数据并将其存储在 Azure Blob 存储中,然后创建一个队列,让 Snowflake 读取和摄取 JSON 文件。然后,我们将使用 Snowflake 为每个细分市场运行一项任务(由分析师或高管决定),数据将输出到如下表所示:

<头>
帐户 ID 游戏 SegmentID 创建时间 已删除
123456789 第一场 1 2021-04-20 2021-04-21
123456789 第一场 2 2021-04-20
123456789 第一场 3 2021-04-20

SegmentID 可以代表什么

<头>
SegmentID 细分类型 段描述
1 连续 5 天 用户连续玩了 5 天
2 连续 10 天 用户连续玩了 10 天
3 连续 15 天 用户连续玩了 15 天

在管道的下一步中,用户通过身份验证所使用的相同 API 应在游戏启动时发布请求以获取用户匹配的所有段。然后,开发团队将决定会话的地点、时间以及如何使用信息来个性化内容。类似的东西:

select
  SegmentID
from
  SegmentTable
where
  AccountID='{AccountID the App authenticated with}' and
  Game='{Game the App authenticated with}' and
  DeletedAt is null

回复:

<头>
SegmentID
2
3

序列化:

{"SegmentID": [2,3]}

我们预计每天有大约 300K-500K 的用户。我的问题是,将这些信息从 Snowflake 获取回客户端的最有效和最具成本效益的方法是什么,以便在查询相同端点时如此数量的用户不会出现问题,并且成本不会很高。

1 个答案:

答案 0 :(得分:0)

好的,有点解决方法,但我在 Snowflake(使用 Azure Functions)上创建了一个外部函数,它在本地 MongoDB 集群中更新数据。因此 API 连接到 MongoDB 实例,该实例可以处理大量并发连接,并且由于它位于本地服务器上,因此非常便宜。唯一的成本是从 Snowflake 到 MongoDB 的数据传输以及在 Azure Functions 上运行应用服务计划(无法使用基于消费的方式将数据发送到我们需要创建 VNET、NAT 网关和静态出站的内部服务器Azure 中的 IP 地址)以及我必须在 Azure 中创建的 API 管理服务。

那么它是如何工作的呢?对于 Snowflake 中的每个存储过程,最后我将收集已更改的段(新行或 DELETED_AT 不为空)并触发使用 pymongo 客户端在 MongoDB 中更新数据的外部函数。