架构漂移未按预期工作 Azure DF(2 种不同架构格式的多个文件)

Posted

技术标签:

【中文标题】架构漂移未按预期工作 Azure DF(2 种不同架构格式的多个文件)【英文标题】:Schema Drift not working as expected Azure DF (Multiple files of 2 different schema formats) 【发布时间】:2021-03-09 01:10:09 【问题描述】:

Derived column pattern 客观的 : 我们有两个具有不同模式格式的示例数据集。我们的目标是使用单个管道加载源中存在的不同模式格式文件,因为我们不可能根据它们的模式分离源文件。数据被加载到具有附加结构的数据库中。 我们在 Azure 数据工厂中创建了一个管道,该管道连接到源并使用派生列转换加载源中存在的所有 csv。 源和接收器都启用了架构漂移,并且在派生列转换中使用了列模式。

问题:如果源中仅存在 A 类型或仅 S 类型文件,但如果两个文件混合在一起,则管道工作正常并正确映射目标列,则目标表上的映射不正确。当源将两个不同的源文件混合在一起时,架构漂移不起作用。 这是使用表结构定义的架构格式。

Schema A 格式:文件名、成本类型、资源类型、组、子组、描述、工资等级、资源名称、日期、小时

Schema B 格式:文件名、成本类型、资源类型、组、子组、WBS 名称、活动名称、资源名称、日期、时间

【问题讨论】:

那么SQL表中A类型和B类型的列都有吗? 是的,SQL 表中 A 和 B 的所有列都是这样的。 [文件名] [nvarchar](max) NULL,[CostType] [nvarchar](max) NULL,[ResourceType] [nvarchar](max) NULL,[组] [nvarchar](max) NULL, [子组] [nvarchar](max) NULL, [Description] [nvarchar](max) NULL, [PayClass] [nvarchar](max) NULL, [ResourceName] [nvarchar](max) NULL, [Date] [ nvarchar](max) NULL, [Hours] FLOAT NULL, [WBSName] [nvarchar](max) NULL, [Activity Name] [nvarchar](max) NULL 【参考方案1】:

架构漂移通过自动处理对源元数据的更改来保护您的 ETL。 https://docs.microsoft.com/en-us/azure/data-factory/concepts-data-flow-schema-drift

您的用例不同。您正在尝试定义具有多个不同架构定义的单个源。如果您正在处理 Parquet 源文件,我们可以执行隐式 schemaMerge。但由于您正在处理 CSV 源,因此您需要一种替代方法。

您在每个管道执行中处理多少个文件?您能否改为从管道 ForEach 一次将一个文件发送到数据流活动中?

这种方法之所以有效,是因为每次调用时数据流都会动态发现架构。建议在将 ForEach 与数据流活动一起使用时,尽量减少并行化并使用顺序方法,这会限制这种方法的可扩展性。

【讨论】:

【参考方案2】:

@Mark Kromer MSFT 所说的是正确的。我们可以通过 ForEach 活动从不同的模式格式文件中导入数据。根据您的屏幕截图,我猜您正在使用 csv 文件作为数据源。

基于上述情况,我认为我们不需要使用数据流。我做了如下实验: 我在 Azure Data Lake gen2 容器 test5 中创建了两个 csv 文件,并在 Azure SQL 中以您的格式创建了一个表: 最后,我将两个不同的模式 csv 文件导入到 SQL 表中。

在 ADF 中:

    我们可以在 Get Metadata1 活动中使用Child Items 来获取文件列表。

    然后我们可以在 ForEach1 活动中遍历文件列表。

    在 ForEach 活动 1 中,我们可以使用 Get Metadata2 来获取文件结构(列名)。 文件结构如下,数据集为DelimitedText45我们接下来使用这个数据集: 在源数据的文件路径选项中,我们需要键入@item().name

    在 If Condition 活动中,我们可以使用@equals(activity('Get Metadata2').output.structure[5].name,'Description') 来确定文件的类型。

    在真实情况下,我定义了一个 Copy activity1 并创建了 test5 容器的新数据集。

我们需要导入架构并设置映射

    在错误情况下,步骤相同。我定义了一个复制活动2。 我们可以使用相同的数据集,但我们需要导入架构并再次设置映射

    然后我们可以运行debug,数据会正确导入到sql表中。

【讨论】:

非常感谢您为此付出的巨大努力,但是 csv 的名称不能用于区分两种模式格式,它的一列说成本类型可以像“A%”或“S%” 你不需要按照上面约瑟夫的例子。事实上,IMO,它太复杂了。相反,只需像以前一样使用数据流,但参数化源数据集并发送文件名以从 ForEach 处理。这将使数据流中的架构漂移适用于您的用例。 @Charu Thareja,我已经更新了我的答案,我们可以根据列名来判断架构。我也试过马克的回答,但得到了error,也许我错过了什么 谢谢马克,但正如我所说,我们无法从他们的名字中区分类型的类型

以上是关于架构漂移未按预期工作 Azure DF(2 种不同架构格式的多个文件)的主要内容,如果未能解决你的问题,请参考以下文章

Azure API 管理集状态代码策略未按预期工作

Spring 2 Web Security 不同的身份验证未按预期工作

使用 Terraform random_id 创建多个资源未按预期工作

Azure 数据工厂附加大量与 csv 文件具有不同架构的文件

事务回滚未按预期工作

身份服务器 4 中的静默令牌更新,js 客户端应用程序未按预期工作