我想请教您有关与数据仓库和SSIS / SSAS有关的处理空值或空数据值的最佳做法是什么。
我有几个事实和维度表,这些表在不同的行中包含空值。
细节:
1) 处理空日期/时间值的最佳方法是什么?我应该在时间或日期维度中添加“默认”行,并且在找到空值时将SSIS指向默认行吗?
2) 处理维数据中的空值/空值的最佳方法是什么。例如:我在“帐户”维度中有一些行,在“帐户名称”列中具有空值(非NULL)。我应该将列内的这些空值或空值转换为特定的默认值吗?
3) 与上述第1点类似- 如果我最后得到一个Facttable行,但其中任一维列中没有记录,该怎么办?如果发生这种情况,我是否需要每个维度的默认维度记录?
4) 关于如何在Sql服务器集成服务(SSIS)中处理这些操作的任何建议或技巧?最好使用最佳数据流配置或最佳转换对象。
谢谢 :-)
如前一个答案所述,维度的Null值可能具有许多不同的含义,未知,不适用,未知等。如果能够在应用程序中区分它们,添加“伪”维度条目会有所帮助,这很有用。
无论如何,我都避免使用Null事实外键或维度字段,即使只有一个“未知”维度值也将帮助您的用户定义查询,其中包括数据质量不是100%的包罗万象的分组(而且永远不会)。
我一直在使用的一个非常简单的技巧,至今尚未咬住我,是在T-sql中使用int IDENTITY(1,1)定义我的尺寸替代键(从1开始,每行递增1)。伪键(“不可用”,“未分配”,“不适用”)被定义为负整数,并由在ETL过程开始时运行的存储过程填充。
例如,创建为的表
CREATE TABLE [dbo].[Location] ( [LocationSK] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NOT NULL, [Abbreviation] [varchar](4) NOT NULL, [LocationBK] [int] NOT NULL, [EffectiveFromDate] [datetime] NOT NULL, [EffectiveToDate] [datetime] NULL, [Type1Checksum] [int] NOT NULL, [Type2Checksum] [int] NOT NULL, ) ON [PRIMARY]
和存储过程填充表
Insert Into dbo.Location (LocationSK, Name, Abbreviation, LocationBK, EffectiveFromDate, Type1Checksum, Type2Checksum) Values (-1, 'Unknown location', 'Unk', -1, '1900-01-01', 0,0)
我已经制定了一个规则,即每个维度至少要有一个这样的伪行,以用于维度查找失败的情况,并建立异常报告以跟踪分配给此类行的事实数量。