SSIS - 在将事实与查找 table 匹配两次时重用 Ole DB 源
SSIS - Reuse Ole DB source when matching Fact against lookup table twice
总的来说,我对 SSIS
和 BI 还很陌生,如果这是一个新手问题,首先很抱歉。
我在 csv 中有关于事实 table 的源数据,所以我想将 ID 与查找 tables 中的代理键进行匹配。
csv中的数据结构是这样的
... userId, OriginStationId, DestinyStationId,..
我想要完成的是将数据与我的查找相匹配 table。所以我正在做的是
- 正在使用 OLE DB 源读取查找数据
- 正在读取我的 csv 文件
- 按同一字段对两个输入进行排序
- 通过 Id 进行左连接,以获得 SK
这样,如果没有匹配项(也就是找不到代理键),我可以将其重定向到被拒绝的 csv 并稍后处理。
像这样:
(对不起西班牙语!)
我对每个维度都这样做,所以我可以用不同的错误代码处理每个维度。
由于 OriginStationId
和 DestinyStationId
是来自同一维度的两个值(它们都匹配相同的查找 table),我想知道是否有办法避免阅读来自 table 的两倍数据(我的意思是,不要使用两个 ole db 源从同一 table 读取两倍数据)。
我尝试在排序中添加第二个输出,但不允许这样做。从 OLE DB Source
.
添加另一个输出也是如此
我看到有一个 "cache option",这是最好的方法吗? (虽然它会暗示创建另一个 OLE DB source
.. 对吧?)
我想到的第三个选项是通过两个字段连接,但由于查找中只有一个字段 table(同一字段),当我尝试映射两个列时出现错误来自我的 csv 与我查找中的同一列 table
There are columns missing with the sort order 2 to 2
最好的方法是什么?
或者我想错了什么?
如果有什么不清楚,请告诉我,我会更新我的问题
任何时候您希望您可以从一个只允许一个的组件获得多个输出,您所要做的就是在该组件之后使用多播组件,其唯一目的是将数据流流拆分为多个输出。
贡萨洛
我刚刚使用了这篇关于如何为数据仓库构建导出列的文章:- How to Populate a Fact Table using SSIS (part 1)。
我使用它构建了一个简单的程序包,它读取一个 CSV 文件,其中有两列用于从同一个代码表中派生不同的值。 CodeTable 有两个字段 Id 和 Description。
数据流有两个 "Lookup" 任务。第一个将属性 Lookup1 与 Description 结合起来以派生其 Id。第二个根据描述加入属性 Lookup2 以派生不同的 ID。
这是数据流:-
请注意,需要 "Data Conversion" 将字符串属性从 CSV 文件转换为 "Unicode string [DT_WSTR]",以便它们可以连接到 table 中的 nvarchar(50) 描述属性。
这是数据转换:-
这是第一个查找(第二个将 "Copy of Lookup2" 加入描述):-
这是带有两个派生 ID CodeTableFirstId 和 CodeTableSecondId 的数据查看器输出:-
希望我理解你的问题,这对你有用。
干杯约翰
总的来说,我对 SSIS
和 BI 还很陌生,如果这是一个新手问题,首先很抱歉。
我在 csv 中有关于事实 table 的源数据,所以我想将 ID 与查找 tables 中的代理键进行匹配。
csv中的数据结构是这样的
... userId, OriginStationId, DestinyStationId,..
我想要完成的是将数据与我的查找相匹配 table。所以我正在做的是
- 正在使用 OLE DB 源读取查找数据
- 正在读取我的 csv 文件
- 按同一字段对两个输入进行排序
- 通过 Id 进行左连接,以获得 SK
这样,如果没有匹配项(也就是找不到代理键),我可以将其重定向到被拒绝的 csv 并稍后处理。
像这样:
(对不起西班牙语!)
我对每个维度都这样做,所以我可以用不同的错误代码处理每个维度。
由于 OriginStationId
和 DestinyStationId
是来自同一维度的两个值(它们都匹配相同的查找 table),我想知道是否有办法避免阅读来自 table 的两倍数据(我的意思是,不要使用两个 ole db 源从同一 table 读取两倍数据)。
我尝试在排序中添加第二个输出,但不允许这样做。从 OLE DB Source
.
我看到有一个 "cache option",这是最好的方法吗? (虽然它会暗示创建另一个 OLE DB source
.. 对吧?)
我想到的第三个选项是通过两个字段连接,但由于查找中只有一个字段 table(同一字段),当我尝试映射两个列时出现错误来自我的 csv 与我查找中的同一列 table
There are columns missing with the sort order 2 to 2
最好的方法是什么? 或者我想错了什么? 如果有什么不清楚,请告诉我,我会更新我的问题
任何时候您希望您可以从一个只允许一个的组件获得多个输出,您所要做的就是在该组件之后使用多播组件,其唯一目的是将数据流流拆分为多个输出。
贡萨洛
我刚刚使用了这篇关于如何为数据仓库构建导出列的文章:- How to Populate a Fact Table using SSIS (part 1)。
我使用它构建了一个简单的程序包,它读取一个 CSV 文件,其中有两列用于从同一个代码表中派生不同的值。 CodeTable 有两个字段 Id 和 Description。
数据流有两个 "Lookup" 任务。第一个将属性 Lookup1 与 Description 结合起来以派生其 Id。第二个根据描述加入属性 Lookup2 以派生不同的 ID。
这是数据流:-
请注意,需要 "Data Conversion" 将字符串属性从 CSV 文件转换为 "Unicode string [DT_WSTR]",以便它们可以连接到 table 中的 nvarchar(50) 描述属性。
这是数据转换:-
这是第一个查找(第二个将 "Copy of Lookup2" 加入描述):-
这是带有两个派生 ID CodeTableFirstId 和 CodeTableSecondId 的数据查看器输出:-
希望我理解你的问题,这对你有用。
干杯约翰