如何在接收器转换中将JSON字符串映射为对象类型 [英] How to map a json string into object type in sink transformation

查看:14
本文介绍了如何在接收器转换中将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆