架构漂移未按预期工作 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 种不同架构格式的多个文件)的主要内容,如果未能解决你的问题,请参考以下文章
Spring 2 Web Security 不同的身份验证未按预期工作
使用 Terraform random_id 创建多个资源未按预期工作