Azure数据工厂:将数据从CosmosDB复制到SQL数据库失败,其中"范围索引"错误

时间:2018-03-02 00:56:41

标签: azure azure-sql-database azure-cosmosdb azure-data-factory

我需要将Azure CosmosDB(以前称为DocumentDB)中的数据移动到Azure SQL数据库中。

我正在使用"复制数据"资源,我设置了源和目标以及映射。

时间表已设置为每小时一次。问题:

  1. 我注意到没有。实例或"运行"每小时不止一次。这是因为它失败并且它会在一定时间内重试吗?
  2. 其失败的主要错误似乎是:
  3.   

    活动Copy_dbo_SubscriptionLocator失败:发生了失败   '来源'侧。   错误码= UserErrorDocumentDBReadError,'类型= Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,消息= DocumentDb   操作失败:消息:{"错误":["无效查询已被执行   使用针对未进行范围索引的路径的过滤器指定。   请考虑在请求中添加允许扫描标头。"]}

    我需要对CosmosDB进行哪些更改以避免错误?

    以下是我目前的索引政策:

    {
        "indexingMode": "consistent",
        "automatic": true,
        "includedPaths": [
            {
                "path": "/*",
                "indexes": [
                    {
                        "kind": "Range",
                        "dataType": "Number",
                        "precision": -1
                    },
                    {
                        "kind": "Hash",
                        "dataType": "String",
                        "precision": 3
                    }
                ]
            }
        ],
        "excludedPaths": [
            {
                "path": "/OneOfTheColumns/*"
            }
        ]
    }
    

    看起来问题在于datetime字段,需要将其作为字符串进行范围索引。我可以在文档中使用_ts字段。但是,如何更改复制作业以将查询的日期时间转换为纪元时间,并将其值用于_ts字段。

2 个答案:

答案 0 :(得分:2)

您需要更新文档集合的索引策略以允许此查询。

假设您有一个类似&#34的查询;从c中选择*,其中c.property>"某些内容",此c.property必须具有范围索引。

您可以详细了解索引政策here:和here

答案 1 :(得分:2)

我不确定您使用的是哪种语言,所以我转发了您的问题,请参阅我的步骤。

我的示例文档:

[
    {
        "id": "1",
        "name": "Jay",
        "course": "A",
        "score": 50
    },
    {
        "id": "2",
        "name": "Peter",
        "course": "B",
        "score": 20
    }
]

指数政策:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/name/?",
            "indexes": [
                {
                    "kind": "Hash",
                    "dataType": "String",
                    "precision": 3
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]
        }
    ],
    "excludedPaths": [
        {
            "path": "/*"
        }
    ]
}

来源查询:(SELECT c.id,c.name,c.course,c.score FROM c where c.score>30)

enter image description here

重现您的问题:

enter image description here

  

Range支持高效的等式查询,范围查询(使用>,<,

     
    

=,< =,!=)和ORDER BY查询。 ORDER默认情况下,查询还需要最大索引精度(-1)。数据类型可以是String或     号。

  

当你有范围查询时,你需要在字段上定义范围索引。请参阅官方doc

因此,我修改了上述索引策略并成功复制了数据:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": []
}

enter image description here

enter image description here

希望它对你有所帮助。