【问题标题】:Azure Data Factory REST API paging with Elasticsearch使用 Elasticsearch 进行 Azure 数据工厂 REST API 分页
【发布时间】:2021-04-07 18:00:14
【问题描述】:

在开发将使用 Elasticsearch 作为来源的管道期间,我遇到了与分页相关的问题。我正在使用 SQL Elasticsearch API。基本上,我已经开始在邮递员中提出请求并且效果很好。请求正文如下所示:

{
    "query":"SELECT Id,name,ownership,modifiedDate FROM \"core\"  ORDER BY Id",
    "fetch_size": 20,
    "cursor" : ""
}

在响应正文中第一次运行后,它包含指向下一页的光标字符串。如果在邮递员中我发送请求并提供上一个请求中的光标值,它将返回第二页的数据,依此类推。我正在尝试在 Azure 数据工厂中存档相同的结果。为此,我使用了复制活动,它存储对 Azure blob 的响应。源设置如下。 copy activity source configuration

这是身体的表达

    {
    "query": "SELECT Id,name,ownership,modifiedDate FROM \"@{variables('TableName')}\" WHERE ORDER BY Id","fetch_size": @{variables('Rows')}, "cursor": ""
    }

我不知道如何正确设置分页规则。管道正常工作,但仅适用于第一个请求。我尝试设置 Headers.cursor 和表达式 $.cursor 但此设置会导致无限循环并且管道因 Elasticsearch 限制而失败。

我也尝试阅读https://docs.microsoft.com/en-us/azure/data-factory/connector-rest#pagination-support 的文档,但它似乎在使用示例方面非常有限且难以理解。

有人可以帮助我了解如何利用分页能力构建管道吗?

光标响应如下:

{
    "columns": [
        {
            "name": "companyId",
            "type": "integer"
        },
        {
            "name": "name",
            "type": "text"
        },
        {
            "name": "ownership",
            "type": "keyword"
        },
        {
            "name": "modifiedDate",
            "type": "datetime"
        }
    ],
    "rows": [
        [
            2,
            "mic Inc.",
            "manufacture",
            "2021-03-31T12:57:51.000Z"
        ]
    ],
    "cursor": "g/WuAwFaAXNoRG5GMVpYSjVWR2hsYmtabGRHTm9BZ0FBQUFBRUp6VGxGbUpIZWxWaVMzcGhVWEJITUhkbmJsRlhlUzFtWjNjQUFBQUFCQ2MwNWhaaVIzcFZZa3Q2WVZGd1J6QjNaMjVSVjNrdFptZDP/////DwQBZgljb21wYW55SWQBCWNvbXBhbnlJZAEHaW50ZWdlcgAAAAFmBG5hbWUBBG5hbWUBBHRleHQAAAABZglvd25lcnNoaXABCW93bmVyc2hpcAEHa2V5d29yZAEAAAFmDG1vZGlmaWVkRGF0ZQEMbW9kaWZpZWREYXRlAQhkYXRldGltZQEAAAEP"
}

【问题讨论】:

  • 服务器返回的响应是包含下一页的绝对地址还是相对地址?微软官方教程是直接发送下一页请求的绝对地址。
  • 不,很遗憾,响应只包含光标。如果我在请求正文中传递此光标,则响应将包含来自下一页的数据。
  • 光标是否包含下一页的信息?你能在光标上显示一些 sn-ps 吗?
  • 当然。对不起。我会把它添加到问题中

标签: elasticsearch azure-data-factory rest


【解决方案1】:

我终于找到了解决方案,希望它对社区有用。 基本上,需要做的是将解决方案分为四个步骤。

第 1 步按照问题描述和暂存文件向 blob 发出第一个请求。 步骤 2 读取 blob 文件并获取光标值,将其设置为变量 步骤 3 继续请求更改正文的数据

{"cursor" : "@{variables('cursor')}" }

管道如下所示: pipeline

分页配置如下 pagination 。这是一种解决方法,因为服务器会忽略此标头,但我们需要一些允许循环发送请求的东西。

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2022-08-03
    • 2020-06-01
    • 2022-06-20
    • 2021-03-13
    • 2022-01-26
    • 2021-09-12
    • 2021-12-06
    相关资源
    最近更新 更多