来源:Azure存储表具有三个字段:PartitionKey(字符串),RowKey(字符串)和Value(字符串)。
接收器:具有三个字段的cosmo db容器:id(字符串),RowKey(字符串)和Value(对象)。
我想将源的值转换为对象而不是字符串,以便cosmodb以这种方式对其进行索引。如果我通过UI进行映射,则将其作为纯字符串同步:
{ "Value": "{\"abc\":\"def\",\"id\":\"1a076c19ff8b41489563453ffbbbb931\"}" }
我希望它像什么地方
{ "Value": {"abc":"def", "id":"123"} }
我需要使用动态映射,但是在阅读文档后,尚不清楚如何执行此操作。
答案 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