如何在接收器转换中将 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.