【问题标题】:Azure REST API - returning only 500 rowsAzure REST API - 仅返回 500 行
【发布时间】:2021-06-16 21:47:15
【问题描述】:

我正在尝试使用 Rest API 作为 Azure 数据工厂中的数据源。

当我像底部一样使用Base URL时,它只导入了500行数据。

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05];

因此,根据我通过互联网研究获得的一些信息,我尝试添加更多参数来提高限制,但我没有运气。

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 5000 OFFSET 5000];

基于this article,提到了添加这些参数($top & $count=true)。

我尝试了类似的方法,但它仍然只导入了 500 行数据。

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05]&$top=10000&$count=true;

如何在 Azure 数据工厂中加入来自 Rest API 的超过 500 行数据?

这是web site,它解释了这个 SQL 查询:

由于提到了“数据集”和“SQL 查询”,我不确定应该采取哪种方法。

现在,我的问题是,我们并没有严格限制 JSON 格式的输出,对吗?

我很好奇,因为当我尝试将数据下载为 JSON 格式时,不知何故,当我尝试从 JSON 编辑器读取数据时似乎导致了一些错误。

【问题讨论】:

  • 您是否尝试过https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 500 OFFSET 500];,因为从我在文档中看到的内容来看,您应该如何获得第 2 页
  • @GregGalloway 我刚刚尝试过,它仍然只插入了 500 行。
  • 是的,只有 500 行,但它是行的第二页。您将不得不遍历每一页,直到少于 500 行。像这样的东西:stackoverflow.com/questions/56949173/…
  • @GregGalloway 感谢您的链接。我更新了我的问题(关于将 JSON 格式以外的方法作为输出的开放式问题)。当我阅读您提到的链接时,输出似乎是 JSON 格式 (OPENJSON(@json))。引用此数据源的网站 (data.cms.gov/provider-data/dataset/4pq5-n9py),SQL 查询部分未指定输出应为 JSON 格式。我只是不知道应该在哪里以及如何解决我的问题。我应该使用“数据集”还是应该使用“SQL 查询”?

标签: azure-data-factory rest


【解决方案1】:

对于任何单个请求,REST API 最多只能返回 500 个结果,您无法更改。

您需要连续请求增加偏移量参数:

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 500 OFFSET 0]; 

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 500 OFFSET 500]; 

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 500 OFFSET 1000]; 

https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 500 OFFSET 1500]; 

etc.

如何在 Powershell 中检索所有数据的示例:

$offset = 0

do{
  $url = "https://data.cms.gov/provider-data/api/1/datastore/sql?query=[SELECT * FROM af6b8b82-3893-55d4-9cea-bf8101a05e05][LIMIT 500 OFFSET $offset];"
  write-progress "Getting data at offset $offset"
  $res = (invoke-webrequest $url).content | convertfrom-json
  $res | export-csv data.csv -append
  $offset += 500
}while ($res.count -eq 500)

【讨论】:

  • 感谢您的帮助。看来我得到了大约 15,000 个数据。在这种情况下我是否手动将 OFFSET 更改为 15000?
  • Offset = 15000 将检索最后 316 条记录,返回少于 500 条记录的事实是您不将偏移量提前到 15500 的线索。我怀疑您是否会手动进行,您会在循环中以编程方式推进偏移量。我已经添加了一个例子。
  • 我想像你展示的那样放置每个 URL 不是选项,对吗?所以我们必须像这样一个一个地让它工作,对吗?一个网址不行,对吧?在你给我一个 Powershell 选项的例子之后,我正在尝试研究 Azure Batch Linked Service 选项。这是正确的方法吗?互联网上似乎没有多少例子可以效仿。我想获得一些关于专注于 Azure Batch 选项的反馈。谢谢。
  • 顺便说一句,您的 Powershell 脚本基本上输出到 csv 文件中,对吗?对不起。我有点困惑。我正在尝试直接使用 Rest API 将数据拉入 Azure SQL 数据库。
  • 手动列出每个 URL 不是一种选择,因为数据量会发生变化,请求数也会发生变化。
猜你喜欢
  • 2021-01-28
  • 2015-09-07
  • 2016-12-22
  • 1970-01-01
  • 2013-03-20
  • 2021-04-09
  • 2019-02-06
  • 2018-09-30
  • 2017-09-12
相关资源
最近更新 更多