Hash SAS哈希联接返回意外结果
对于正在工作的项目,我们多次将两个大型数据集连接在一起。我们使用散列联接,因为它要快得多。最近我们发现哈希连接偶尔返回错误的值,但我们真的不知道为什么。一位同事检查并更改了哈希表中的列名,因此我们现在对返回值和哈希表中的列名使用不同的名称(而不是Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001),我们使用Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001)这似乎是可行的,但只是担心它一开始就发生了,我们想确保我们已经解决了根本问题。奇怪的是,连接似乎正确地匹配了几个字段(行业、州、权重类、类型等)但它会以1000000英镑而不是250000英镑的价格提取ILF,而这正是它应该提取的Hash SAS哈希联接返回意外结果,hash,sas,Hash,Sas,对于正在工作的项目,我们多次将两个大型数据集连接在一起。我们使用散列联接,因为它要快得多。最近我们发现哈希连接偶尔返回错误的值,但我们真的不知道为什么。一位同事检查并更改了哈希表中的列名,因此我们现在对返回值和哈希表中的列名使用不同的名称(而不是Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001),我们使用Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001)这似乎是可行的,但只是担心它一开始就发生了,我们想确保我们已经解决了根本问题
data liabumuimilffactor (drop=liabumuimilf_factors_dte_key liabumuimilf_factor_state_join veh_wgt_class industry Limit ILF_Bucket Eff_dt Exp_Dt Created_Dt state dte_key
LIAB_ILF_Fact UM_UIM_ILF_Fact PIP_ILF_Fact);
if 0 Then Set ilf_input Liab_UM_UIM_ILF_Factor;
if _N_ = 1 then do;
Declare Hash ILF_Factor_Hash(Dataset:"Liab_UM_UIM_ILF_Factor");
ILF_Factor_Hash.DefineKey('state', 'dte_key', 'Veh_Type', 'Veh_Wgt_Class', 'Industry', 'Limit');
ILF_Factor_Hash.DefineData('ILF_Bucket', 'LIAB_ILF_Fact', 'UM_UIM_ILF_Fact', 'PIP_ILF_Fact');
ILF_Factor_Hash.DefineDone();
end;
set ilf_input;
if ILF_Factor_Hash.Find(Key:liabumuimilf_factor_state_join, Key:liabumuimilf_factors_dte_key, Key:Veh_Type, Key:Veh_Wgt_Class_Mapped, Key:IndustryGroup, Key:Liab_Limit) = 0 then do;
Liab_ILF_Factor = round(LIAB_ILF_Fact, .001);
Liab_ILF_Bucket = ILF_Bucket;
end;
else do;
Liab_ILF_Factor = .;
Liab_ILF_Bucket = "";
end;
if ILF_Factor_Hash.Find(Key:liabumuimilf_factor_state_join, Key:liabumuimilf_factors_dte_key, Key:Veh_Type, Key:Veh_Wgt_Class_Mapped, Key:IndustryGroup, Key:UM_UIM_Limit) = 0 then do;
UM_UIM_ILF_Factor = round(UM_UIM_ILF_Fact, .001);
UM_UIM_ILF_Bucket = ILF_Bucket;
end;
else do;
UM_UIM_ILF_Factor = .;
UM_UIM_ILF_Bucket = "";
end;
if ILF_Factor_Hash.Find(Key:liabumuimilf_factor_state_join, Key:liabumuimilf_factors_dte_key, Key:Veh_Type, Key:Veh_Wgt_Class_Mapped, Key:IndustryGroup, Key:PIP_Limit) = 0 then do;
PIP_ILF_Factor = round(PIP_ILF_Fact, .001);
PIP_ILF_Bucket = ILF_Bucket;
end;
else do;
PIP_ILF_Factor = .;
PIP_ILF_Bucket = "";
end;
run;
Liab_UM_UIM_ILF_Factor
填充ILF_Factor_Hash
似乎有点奇怪。当“Limit”键项选择要“使用”的数据项时,为什么要将这三个事实都存储为数据项?这就像是在那个细节级别执行3x3矩阵,并将值存储在对角线上以供检索。为什么不存储一个事实值(而不是一个值和两个不适用的)每个限制值?如果我理解你的问题-我们对每个限制有不同的因素的原因是不同的“保险范围”有不同的因子。我们可以将覆盖率作为一个额外的键,然后如果有一些性能增强,则每行有一个因子。我们从不同的源中提取因子表,操作越少越好。