由于源数据集中的数据与目标数据集相比不兼容,因此我收到时间和错误的错误。我想控制管道根据错误类型确定的操作,可能输出或丢弃那些微粒行,但还要完成其他所有操作。那可能吗?此外,是否可以从数据工厂获取实际的故障线路,而无需以某种简单的方式访问和搜索实际的源数据集?
复制活动在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, ' 的
由于
答案 0 :(得分:3)
我认为你在ADF中遇到了一个相当普遍的问题和限制。虽然使用JSON定义的数据集允许ADF理解数据的结构,这就是结构,但编排工具无法做任何事情来转换或操作数据作为活动处理的一部分。 / p>
直接回答你的问题,这当然是可能的。但是你需要打破C#并使用ADF的可扩展性功能来处理坏行,然后再将它传递到最终目的地。
我建议您扩展数据工厂以包含自定义活动,您可以在其中构建一些较低级别的清理过程,以便按照描述转移坏行。
这是我们经常采用的一种方法,因为并非所有数据都是完美的(我希望), ETL 或 ELT 不起作用。我更喜欢首字母缩略词 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处理当前服务产品中的错误数据的唯一方法。
希望这有帮助