如何在接收器转换中将JSON字符串映射为对象类型 [英] How to map a json string into object type in sink transformation
本文介绍了如何在接收器转换中将JSON字符串映射为对象类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用Azure数据工厂和数据转换流程。我有一个CSV,它包含一个带有json对象字符串的列,下面是一个包含标题的示例:
"Id","Name","Timestamp","Value","Metadata"
"99c9347ab7c34733a4fe0623e1496ffd","data1","2021-03-18 05:53:00.0000000","0","{""unit"":""%""}"
"99c9347ab7c34733a4fe0623e1496ffd","data1","2021-03-19 05:53:00.0000000","4","{""jobName"":""RecipeB""}"
"99c9347ab7c34733a4fe0623e1496ffd","data1","2021-03-16 02:12:30.0000000","state","{""jobEndState"":""negative""}"
"99c9347ab7c34733a4fe0623e1496ffd","data1","2021-03-19 06:33:00.0000000","23","{""unit"":""kg""}"
我想将数据存储在json中,如下所示:
{
"id": "99c9347ab7c34733a4fe0623e1496ffd",
"name": "data1",
"values": [
{
"timestamp": "2021-03-18 05:53:00.0000000",
"value": "0",
"metadata": {
"unit": "%"
}
},
{
"timestamp": "2021-03-19 05:53:00.0000000",
"value": "4",
"metadata": {
"jobName": "RecipeB"
}
}
....
]
}
挑战在于元数据具有动态内容,这意味着它将始终是json对象,但内容可能会有所不同。因此,我不能定义架构。当前,接收器架构上的列&元数据&被定义为对象,但每当我运行转换时,我都会遇到异常:
Conversion from ArrayType(StructType(StructField(timestamp,StringType,false),
StructField(value,StringType,false), StructField(metadata,StringType,false)),true) to ArrayType(StructType(StructField(timestamp,StringType,true),
StructField(value,StringType,true), StructField(metadata,StructType(StructField(,StringType,true)),true)),false) not defined
推荐答案
我们可以获得您预期的输出,我们需要表达式来获取对象Metadata.value
。
派生列表达式,创建JSON架构以转换数据:
@(id=Id,
name=Name,
values=@(timestamp=Timestamp,
value=Value,
metadata=@(unit=substring(split(Metadata,':')[2], 3, length(split(Metadata,':')[2])-6))))
Sink映射和输出数据预览:
关键是您的matadata
值是一个对象,可以有不同的架构和内容,可以是‘Value’或其他键。我们只能手动构建模式,它不支持表达式。这是极限。
我们无法在数据工厂内实现这一点。
HTH。
这篇关于如何在接收器转换中将JSON字符串映射为对象类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文