首页 文章

如何控制Azure数据工厂管道中的数据故障?

提问于
浏览
1

由于源数据集中的数据与目标数据集相比不兼容,因此我收到时间和错误的错误 . 我想控制管道根据错误类型确定的操作,可能输出或丢弃那些微粒行,但还要完成其他所有操作 . 那可能吗?此外,是否可以从数据工厂获取实际的故障线路,而无需以某种简单的方式访问和搜索实际的源数据集?

复制活动在Sink端遇到用户错误:ErrorCode = UserErrorInvalidDataValue,'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message = Column'Timestamp'包含无效值'11667' . 无法将'11667'转换为'DateTimeOffset'类型 . ,Source = Microsoft.DataTransfer.Common,''Type = System.FormatException,Message = String未被识别为有效的DateTime . ,Source = mscorlib,' .

谢谢

1 回答

  • 3

    我认为你在ADF中遇到了一个相当普遍的问题和限制 . 虽然使用JSON定义的数据集允许ADF理解数据的结构,这就是结构,但编排工具无法做任何事情来转换或操作数据作为活动处理的一部分 .

    要直接回答你的问题,这当然是可能的 . 但是你需要打破C#并使用ADF的可扩展性功能来处理坏行,然后再将它传递到最终目的地 .

    我建议您扩展数据工厂以包含一个自定义活动,您可以在其中构建一些较低级别的清理过程,以便按照描述转移坏行 .

    这是我们经常采用的方法,因为并非所有数据都是完美的(我希望)并且 ETLELT 不起作用 . 我更喜欢首字母缩略词 ECLT . 'C'代表清洁的地方 . 或者清理,准备等 . 这当然适用于ADF,因为该服务没有自己的计算或SSIS样式的数据流引擎 .

    所以...

    就如何做到这一点而言 . 首先,我建议您查看有关创建ADF自定义活动的博客文章 . 链接:

    https://www.purplefrogsystems.com/paul/2016/11/creating-azure-data-factory-custom-activities/

    然后在你继承自 IDotNetActivity 的C#类中执行类似下面的操作 .

    public IDictionary<string, string> Execute(
            IEnumerable<LinkedService> linkedServices,
            IEnumerable<Dataset> datasets,
            Activity activity,
            IActivityLogger logger)
        {
    
        //etc
    
        using (StreamReader vReader = new StreamReader(YourSource))
            {
                using (StreamWriter vWriter = new StreamWriter(YourDestination))
                {
                    while (!vReader.EndOfStream)
                    {
                    //data transform logic, if bad row etc
                    }
                }
            }
      }
    

    你明白了 . 构建自己的SSIS数据流!

    然后将干净的行写为输出数据集,它可以作为下一个ADF活动的输入 . 可以是多个管道,也可以是单个管道中的链接活动 .

    这是让ADF处理当前服务产品中的错误数据的唯一方法 .

    希望这可以帮助

相关问题