如何在接收器转换中将 json 字符串映射到 object 类型
How to map a json string into object type in sink transformation
使用 Azure 数据工厂和数据转换流。我有一个 csv,其中包含一个带有 json object 字符串的列,下面是一个包含 header:
的示例
"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 object,但内容可能会有所不同。因此我无法定义架构。目前,接收器模式上的“元数据”列定义为 object,但每当我 运行 转换时,我 运行 就会出现异常:
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))))
接收器映射和输出数据预览:
关键是您的 matadata
值是一个对象,可能具有不同的架构和内容,可能是 'value' 或其他键。我们只能手动构建模式,它不支持表达式。那是极限。
我们无法在数据工厂内实现该目标。
HTH.
使用 Azure 数据工厂和数据转换流。我有一个 csv,其中包含一个带有 json object 字符串的列,下面是一个包含 header:
的示例"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 object,但内容可能会有所不同。因此我无法定义架构。目前,接收器模式上的“元数据”列定义为 object,但每当我 运行 转换时,我 运行 就会出现异常:
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))))
接收器映射和输出数据预览:
关键是您的 matadata
值是一个对象,可能具有不同的架构和内容,可能是 'value' 或其他键。我们只能手动构建模式,它不支持表达式。那是极限。
我们无法在数据工厂内实现该目标。
HTH.