Azure数据工厂-源到接收器自定义映射,将字符串转换为对象

时间:2019-07-12 14:40:50

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

来源:Azure存储表具有三个字段:PartitionKey(字符串),RowKey(字符串)和Value(字符串)。

接收器:具有三个字段的cosmo db容器:id(字符串),RowKey(字符串)和Value(对象)。

我想将源的值转换为对象而不是字符串,以便cosmodb以这种方式对其进行索引。如果我通过UI进行映射,则将其作为纯字符串同步:

{  "Value": "{\"abc\":\"def\",\"id\":\"1a076c19ff8b41489563453ffbbbb931\"}" }

我希望它像什么地方

{ "Value": {"abc":"def", "id":"123"} }

我需要使用动态映射,但是在阅读文档后,尚不清楚如何执行此操作。

2 个答案:

答案 0 :(得分:0)

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

请考虑其他方法。由于您正在使用adf导入数据,因此无法使用PreTrigger来更改创建的文档的格式。PreTrigger需要由代码或rest api调用。

因此,作为解决方法,我建议您在将每个文档导入数据库时​​使用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);
                    }

                }
            }
        }
    }
}

答案 1 :(得分:0)

您需要使用数据流(当前处于预览状态),但这很简单。我不确定是否将字符串转换为JSON,但是有一个函数可用于将其转换为JSON,称为“ json”,请告诉我它的运行方式。

https://docs.microsoft.com/en-us/azure/data-factory/data-flow-create