将增量数据从REST API引入SQL azure

问题描述 投票:3回答:5

我的需求如下: - 需要从第三方API获取数据到SQL azure。

  • 每天都会查询API以获取增量数据,并且可能需要分页,因为默认情况下,任何API响应都只会提供前N个记录。
  • API还需要一个身份验证令牌才能工作,这是我们开始从端点下载数据之前的第一个调用。

由于最后两个原因,我选择了每天触发的功能应用程序,而不是可以查询Web API的数据工厂。

有一个更好的方法吗?此外,我正在考虑将所有JSON推送到Blob存储区,然后将数据从JSON解析为SQL Azure。有什么建议?

azure azure-sql-database azure-functions azure-data-factory
5个回答
1
投票

规模要考虑的一件事是并行化查询和处理。如果没有订购要求,或者处理所有记录的时间超过10分钟功能超时。或者,如果您想在飞行中对数据进行一些调整/转换,或者您对不同类型的数据有不同的目的地。或者,如果您希望避免失败 - 例如,您的功能在处理过程中失败,并且您不想重新查询API。或者您以不同的方式获取数据,并希望在流程中的特定步骤开始处理(而不是从入口点运行)。各种各样的原因。

我会在这里说,最好的并行度与复杂度在很大程度上取决于您的舒适程度和要求。以下示例在某种程度上是将流程分解为离散步骤并为每个步骤使用函数的“极端”示例;在某些情况下,拆分特定步骤并将它们组合成一个步骤可能没有意义。 Durable Functions也有助于使这更容易编排。

  • 一个定时器驱动的函数,用于查询API以了解所需页面的深度,或将其他页面排队到实际进行分页API调用的第二个函数
  • 该函数然后查询API,并写入临时区域(如Blob)或将每行丢弃到要写入/处理的队列中(例如,类似于存储队列,因为它们便宜且快速,或者服务总线)如果多方感兴趣(例如,pub / sub)队列
  • 如果写入临时blob,blob触发的函数会读取blob并将单个写入队列排队(例如,存储队列,因为存储队列对于类似的东西来说会很便宜和快速)
  • 另一个队列触发函数实际上处理将各行写入行,SQL或其他任何行的下一个系统。

您可以从中获得一些并行化,以及使用正确格式化的消息从过程中的任何步骤开始的能力。如果您的处理器遇到不良数据,毒性队列/死信队列等内容将有助于处理异常情况,因此您可以手动修复错误数据,而不是整个过程死亡。


2
投票

也许你可以通过SQL Server Agent创建一个时间任务。

SQL server Agent - new job - Steps - new stepenter image description here

在命令中,例如,输入你的Import JSON documents from Azure Blob Storage sql statemanets。

Schedules - new scheduleenter image description here设定执行时间。

但我认为Azure功能对您来说更好.Azure Functions是一种在云中轻松运行小段代码或“功能”的解决方案。您可以只编写手头问题所需的代码,而无需担心整个应用程序或运行它的基础结构。函数可以使开发更高效,您可以使用您选择的开发语言,例如C#,F#,Node.js,Java或PHP。

它更直观,更有效。

希望这可以帮助。


2
投票

如果您可以在api中设置默认的前N个值,那么您可以在azure数据工厂中使用web activity来调用您的rest api来获取响应数据。然后将响应数据配置为复制活动(@activity('ActivityName').output)和sql数据库的输入作为输出。请看这个帖子:Use output from Web Activity call as variable

Web活动支持访问令牌的authentication属性。

此外,我正在考虑将所有JSON推送到Blob存储区,然后将数据从JSON解析为SQL Azure。有什么建议?

好吧,如果您可以将数据转储到blob存储中,那么azure stream analytics是您的最佳选择。

您可以运行每日作业以使用asa sql选择或解析json数据,然后将数据转储到sql数据库中。请参阅此official sample.


2
投票

调用所有页面需要多长时间?如果它是under ten minutes,那么我的建议是构建一个查询API的Azure函数,并将json数据直接插入到SQL数据库中。

Azure功能

Azure功能非常cost effective。第一百万次执行是免费的。如果它需要超过十年,那么看看耐用功能。为了处理分页,我们有很多例子。您的确切解决方案取决于您呼叫的API和您使用的语言。这是C# using HttpClient的一个例子。这是Python using Requests的一个。对于两者,模式是相似的。从API获取页面总数,将变量设置为该值,然后遍历页面;在每次迭代中获取并保存数据。如果API不提供最大页数,则循环直到出现错误。 Protip:确保为这些循环指定上限。此外,如果您的API很复杂或有间歇性故障,请考虑使用优雅的重试模式,例如exponential backoff

Azure SQL Json索引计算列

您提到将数据作为json文件存储到存储容器中。你确定需要吗?如果是这样,那么你可以create an external table link between the storage container and the database。这样做的好处是不会让数据占用数据库中的任何空间。但是,如果json适合数据库,我强烈建议将json直接放入SQL数据库,并利用indexed calculated columns极快地查询json。

使用此配对应该提供每便士价值令人难以置信的性能!让我们知道您最终使用的是什么。


0
投票

岗位

由于分页可能还没有,ADF会令人怀疑。

检查此链接:https://social.msdn.microsoft.com/Forums/en-US/9e43277c-e97c-4335-a17b-e0056d85784e/perform-pagination-for-rest-api-adf?forum=AzureDataFactory

如果有分页,你可以尝试这样:

1.copy活动:对azure blob的http源(这将是代价高昂的部分,取决于你运行的次数)。或者对于分页,如果要在本地处理文件并将其发送到azure blob存储,则可以在VM上为此编写c#代码。

  1. 您可以在Azure SQL数据库中为blob创建外部数据源。然后,您可以使用openrowset和openjson来解析json文件。

有第三方组件不是免费的,但分页选项很容易实现。您只需输入源API,标题和分页设置。 (这里我假设你在VM上有ssis许可证)

© www.soinside.com 2019 - 2024. All rights reserved.