我正在尝试在Azure Data Factory中实现SCD 2,但遇到了更新机制问题。我的过程没有更新行,而是将源数据中的所有行插入到目标数据中,从而导致重复。这个例子只是尝试更新,为了简单起见,我缩小了它-我使用AdventureWorksLT 2019数据库。以下是数据流的细分:
*取数:
***源数据:**从源数据中获取最新的数据集。
***目标数据:**从目标获取当前数据集。
*新数据哈希密钥生成:
- 对于每个新的数据记录,根据以下字段使用SHA 2 -256生成哈希密钥:
New_ProductID
、New_Name
、New_ProductNumber
、New_Color
和New_StandardCost
。
*是否存在检查: - 确保为新数据生成的哈希键在目标数据集中不存在。
*资料编号: - 对目标数据集执行查找。此查找的条件是
Existing_ProductID == New_ProductID
和Existing_Hashkey != HashKey
。
*行变更: - 使用“AlterRow”操作,并将“updateif”条件设置为始终为真(
true()
)。
*列选择和重命名: - 从源数据集中选择前缀为
NEW_
的所有列。对于哈希键,保留目标数据集中的现有哈希键。
*数据接收器(内联-增量数据集类型):
*设置: - 表格操作:没有一
- 允许更新:是的
- 列列表键:
Hashkey
尽管遵循了上述步骤,我仍然在目标中获得重复的行。我尝试了各种调整,比如在接收操作之前更改列键列表和过滤(例如,只插入ID = 707
的行)。然而,这些尝试并没有解决这个问题。
我不知道该怎么补救。任何提示或帮助是赞赏!
2条答案
按热度按时间rjzwgtxy1#
在接收器设置中,给予键列为
Product_id
,而不是hash key
。hash key
作为键列时,行将根据hash key
进行更新。由于hash key
上没有匹配的列,我认为所有行都被插入了,这会导致重复的行。product_id
时,匹配产品id的所有行都将使用新值更新。neekobn82#
好的,结果我问的是苹果的解决方案,而我的问题是梨。我花了相当长的时间才找到问题的根源。
我正在通过Azure Synapse阅读我的数据。* 我想我应该在Azure Synapse中读取.parquet格式的数据 *。但是,由于我没有通过Azure Gen存储帐户gen 2(parquet)目标写入数据。**所以我实际上并没有使用 parquet 格式。**通过“.parquet”格式进行阅读实际上是错误的。由于我是通过DELTA格式写入数据,**我需要使用文件格式“delta”来读取正确的数据。**Delta格式- Microsoft
因此,当通过正确的格式阅读数据时,我得到了正确的视图。
阅读.parquet格式的原因是给我“重复”,是当通过delta写入时,它写入新文件,并将旧文件设置为“不活动”或“不使用”。而delta格式则考虑了这个元数据。因此,即使Delta数据类型写入Parquet格式,它也不同于常规的Parquet文件。