ADF-数据流-属性名称的Json表达式

ADF-数据流-属性名称的Json表达式,json,azure-data-factory,azure-data-factory-2,json-path-expression,Json,Azure Data Factory,Azure Data Factory 2,Json Path Expression,我需要在Azure Data Factory中使用数据流将json转换为csv(或SQL表)或任何其他扁平结构。我需要从源json中获取一些层次结构中的属性名和层次结构中较低层次结构中的子属性值,并将它们作为csv或任何其他扁平结构中的列/行值添加 源数据规则/约束: 父级数据属性名称将动态更改(例如,ABCDATA点、水泥用途、煤炭用途、ABCUSEindicator名称是动态的) 层次结构始终保持与下面的示例json相同 我需要一些帮助来定义Json路径/表达式,以获取名称ABCDATA点、

我需要在Azure Data Factory中使用数据流将json转换为csv(或SQL表)或任何其他扁平结构。我需要从源json中获取一些层次结构中的属性名和层次结构中较低层次结构中的子属性值,并将它们作为csv或任何其他扁平结构中的列/行值添加

源数据规则/约束

  • 父级数据属性名称将动态更改(例如,ABCDATA点、水泥用途、煤炭用途、ABCUSEindicator名称是动态的)
  • 层次结构始终保持与下面的示例json相同
  • 我需要一些帮助来定义Json路径/表达式,以获取名称ABCDATA点、水泥用途、煤炭用途、ABCUSEIndicator等。我能够找出如何检索属性值、ValueDate、ValueScore和AsReported的值

    源数据结构:

    {
    "ABCDataPoints": {
        "CementUse": {
            "Value": null,
            "ValueDate": null,
            "ValueScore": null,
            "AsReported": [],
            "Sources": []
        },
        "CoalUse": {
            "Value": null,
            "ValueDate": null,
            "AsReported": [],
            "Sources": []
        }
    },
    "ABCUseIndicators": {
        "EnvironmentalControversies": {
            "Value": false,
            "ValueDate": "2021-03-06T23:22:49.870Z"
        },
        "RenewableEnergyUseRatio": {
            "Value": null,
            "ValueDate": null,
            "ValueScore": null
        }
    },
    "XYZDataPoints": {
        "AccountingControversiesCount": {
            "Value": null,
            "ValueDate": null,
            "AsReported": [],
            "Sources": []
        },
        "AdvanceNotices": {
            "Value": null,
            "ValueDate": null,
            "Sources": []
        }        
    },
    "XYXIndicators": {
        "AccountingControversies": {
            "Value": false,
            "ValueDate": "2021-03-06T23:22:49.870Z"
        },
        "AntiTakeoverDevicesAboveTwo": {
            "Value": 4,
            "ValueDate": "2021-03-06T23:22:49.870Z",
            "ValueScore": "0.8351945854483925"
        }     
    }
    
    }

    预期扁平化结构
    背景: 在与微软的ADF专家进行多次通话后(我们的工作场所与Microsoft/Azure建立了合作关系),他们得出结论,如果ADF按原样提供开箱即用的活动,无论是数据流(尽管不需要使用数据流)还是扁平化功能,这都是不可能的。原因是数据流/展平仅展开数组对象,并且没有可用于选择属性名称的映射函数-自定义表达式正在进行内部beta测试,不久将在PA中使用

    结论/解决方案: 根据与Microsoft EMP的通话,我们达成了一项协议,最终采用了多种方法,但双方都需要自定义代码-没有自定义代码,使用开箱即用的活动是不可能的

    解决方案-1:使用ADF自定义活动,根据需要使用一些代码进行展平。缺点是您需要使用外部计算(VM/批处理),支持的选项不是按需提供的。所以它有点贵,但如果有连续的流工作负载,效果最好。这种方法还可以持续监视输入源的大小是否不同,因为在这种情况下,计算需要有弹性,否则会出现内存不足异常

    解决方案2:仍然需要编写自定义代码-但在函数应用程序中

    • 创建一个复制活动,将源作为包含Json内容的文件(最好是存储帐户)
    • 将目标用作函数的Rest端点(不是函数活动,因为从ADF活动调用它时有90秒超时)
    • 函数应用程序将Json行作为输入,解析并展平
    • 如果使用上述方法,则可以缩放每个函数请求中发送的行数,还可以缩放并行请求
    • 该函数将根据需要对一个或多个文件进行展平,并存储在blob存储中
    • 管道将根据需要从那里继续铺设
    • 这种方法的一个问题是,如果某个范围失败,复制活动将重试,但它将再次运行整个过程

    恐怕我们无法解析动态键JSON对象。如果键是固定的,我们可以在Azure sql中使用OPENJSON或JSON_值来实现这一点。