从Azure数据工厂复制导入CosmosDB中的JSON数据时出现问题

时间:2020-04-01 12:58:21

标签: azure-cosmosdb azure-data-factory azure-data-factory-2

我的Azure数据工厂管道具有COPY操作,用于将数据从CSV复制到CosmosDB
CSV文件有3列要导入CosmosDB。

CosmosDB集合将收到:

Column1 in Partition Key
Column2 in Id
Column3 whole JSON Value

当我运行COPY时,它将所有3列的数据以String格式复制到CosmosDB中。因为在指定ColumnType时没有JSON或Map类型可用

enter image description here

我应该怎么做才能在值字段(而不是字符串或TEXT)中导入JSON。以下是我在CosmosDB中获得的示例: enter image description here

1 个答案:

答案 0 :(得分:1)

据我所知,没有任何此类功能可以帮助您在adf cosmos db配置中将字符串数据转换为对象格式。

因此,作为解决方法,我建议您使用Azure Function Cosmos DB Trigger处理每个导入数据库的文档。请参考我的功能代码:

using System.Collections.Generic;
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json.Linq;
using System;
using Microsoft.Azure.Documents.Client;

namespace TestADF
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([CosmosDBTrigger(
            databaseName: "db",
            collectionName: "item",
            ConnectionStringSetting = "documentdbstring",
            LeaseCollectionName = "leases")]IReadOnlyList<Document> input, TraceWriter log)
        {
            if (input != null && input.Count > 0)
            {
                log.Verbose("Start.........");
                String endpointUrl = "https://***.documents.azure.com:443/";
                String authorizationKey = "key";
                String databaseId = "db";
                String collectionId = "item";

                DocumentClient client = new DocumentClient(new Uri(endpointUrl), authorizationKey);

                for (int i = 0; i < input.Count; i++)
                {
                    Document doc = input[i];
                    if ((doc.GetPropertyValue<String>("Value") == null) || (!doc.GetPropertyValue<String>("Value")))
                    {                       
                        String V= doc.GetPropertyValue<String>("Value");
                        JObject obj = JObject.Parse(V);

                        doc.SetPropertyValue("Value", obj );

                        client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, doc.Id), doc);

                        log.Verbose("Update document Id " + doc.Id);
                    }

                }
            }
        }
    }
}