(已解决) fjoin@m 拼接维表字段的问题
先说问题:用 fjoin 往事实表上拼接维表字段,以下写法哪个是正确的?
不用并行选项 @m 时:
1、事实表.fjoin(维表.find( 事实表字段), 维表字段 )
2、事实表.fjoin(维表.find( 事实表字段),~. 维表字段 )
使用并行选项 @m 时:
3、事实表.fjoin@m(维表.find( 事实表字段), 维表字段 )
4、事实表.fjoin@m(维表.find( 事实表字段),~. 维表字段 )
经测试发现:
在不使用并行选项时,拼接维表字段写成 "字段名" 或者 "~. 字段名" 都可以,但是,
在使用并行选项时,拼接维表字段必须要写成 "~. 字段名",此时如果光写成 "字段名" 有些情况会不正确,而有些情况又没有问题。
比如,有 3 张表:
事实表:员工信息表 “Employees.txt”,
维度表:缺勤率表 “Absenteeism.txt”
维度表:绩效表 “Performance.txt”
用 fjoin@m 并行拼接维度字段时发现,用缺勤率表 "Absenteeism.txt" 这个维度表时,结果不一样。而用绩效表 "Performance.txt" 这个维度表时结果又没有问题,具体情况截图如下:
请注意代码格 A8、A9 并观察结果中的第 12、14 和 15 行:
涉及到的代码和文件如下,可复制使用:
A | |
1 | =T(“Employees.txt”,ID,Name).keys(ID) |
2 | =T(“Absenteeism.txt”).keys(Employee) |
3 | =T(“Performance.txt”).keys(Employee) |
4 | 没用并行 @m,拼接维表字段可以写成 字段名 或者 ~. 字段名 |
5 | =A1.fjoin(A2.find(ID),Absenteeism) |
6 | =A1.fjoin(A2.find(ID),~.Absenteeism) |
7 | @m 并行,拼接维表字段必须要写成 ~. 字段名,请关注结果中的第 12,14,15 行 |
8 | =A1.fjoin@m(A2.find(ID),Absenteeism) |
9 | =A1.fjoin@m(A2.find(ID),~.Absenteeism) |
10 | 用 A3 维表时,无论是否并行,写成 字段名 或者 ~. 字段名 都可以 |
11 | =A1.fjoin(A3.find(ID),Performance) |
12 | =A1.fjoin(A3.find(ID),~.Performance) |
13 | =A1.fjoin@m(A3.find(ID),Performance) |
14 | =A1.fjoin@m(A3.find(ID),~.Performance) |
15 | 拼接两个维表的字段时跟上述情况一样,并行 @m 时 要写成 ~. 字段名 |
16 | =A1.fjoin(A2.find(ID),Absenteeism;A3.find(ID),Performance) |
17 | =A1.fjoin(A2.find(ID),~.Absenteeism;A3.find(ID),~.Performance) |
18 | =A1.fjoin@m(A2.find(ID),Absenteeism;A3.find(ID),Performance) |
19 | =A1.fjoin@m(A2.find(ID),~.Absenteeism;A3.find(ID),~.Performance) |
文件在帖子 根据考勤和绩效信息计算应发工资 的附件中,或者在此下载↓:
Performance.txt
Absenteeism.txt
Employees.txt
恳请大佬们得空时给予指导帮助,谢谢!
用多线程结果集不对是因为有的线程处理的第一条数据正好找不到匹配的维表记录。
fjoin 函数为了能引用结果集前面的字段会把结果集和计算出的维表序列压栈,维表序列在栈顶,当用 Absenteeism 引用字段值时会从栈顶开始找 Absenteeism 字段,如果第一条数据正好找不到匹配的维表记录时栈顶对应的值就是 null 了,这时会继续在栈里找,因为结果集有 Absenteeism 字段最终就引用到了结果集的字段了,一旦引用到了结果集后续就只会引用结果集的记录。如果用 ~.Absenteeism 引用就只会找栈顶的,所以出现了现在这个现象。
谢谢大佬指导🙏
所以,在用 fjoin@m() 多线程拼接维表字段时,正确且靠谱的写法是 "~. 维表字段名",这样是无论如何不会错的,对吧?
是的,如果是交连接也不会有问题