난이도 : 어려움
작성 배경
//----------------------------------------------------------------------------
// Hierarchy 함수를 사용하려고 하는데, Depth 가 상당히 많고
// Node 가 많은 경우 (1백만건 이상) 인 경우 Hierarchy 함수를 사용하기 어렵다.
// 인위적으로 Depth 를 정해서 Hierarchy 구조를 만들고자 한다.
// Qliker
//----------------------------------------------------------------------------
적용 사례
금융정보분석원에서는 2019년부터 2년간 차세대 FIU 정보시스템 구축사업을 수행하였습니다. 본 프로젝트에 통계분석시스템 및 의심계좌 및 의심거래 분석을 위하여 클릭센스(Qlik Sense)의 네트워크 차트를 이용하여 계좌간 연관도 분석을 수행합니다. 네트워크 차트를 생성하기 위해서는 필수적으로 노드(계좌번호) 와 관계가 필요하고, 각 노드는 계층구조로 생성해야 합니다. 그런데 대용량의 노드와 관계를 갖고 있는 경우 Qlik Sense의 Hierarchy 기능으로는 구조를 생성하는데 엄청난 시간이 소요되어서 본 과정의 모델링으로 해결하였습니다.
이하 과정은 교육교재를 위하여 작성된 내용입니다.
원본 데이터
Source:
Load * Inline [
주체, 상대, 거래금액
A1, B1, 500
B1, C1, 300
C1, D1, 150
];
원본 데이터 가공 (필수)
// 모든 노드는 상대에 있어야 합니다.
Concatenate (Source)
Load Distinct 주체 As 상대
Resident Source;
Concatenate (Source)
Load Distinct 상대 As 상대
Resident Source;
Hierarchy 함수 사용 결과
Hierarchy:
Hierarchy(상대, 주체, 노드명, ParentName, 상대, PathName, '-', Depth)
Load 주체,
[상대],
[상대] As 노드명
Resident Source;
Drop Table Source;
Hierarchy_Make
// First Step
Tmp_1:
Load 주체,
상대,
상대 As 노드명,
주체 As ParentName,
[주체] As 노드명1,
If (Len(주체) > 0, 상대) As 노드명2 ,
If (Len(주체) > 0, 2, 1) As Depth
Resident Source;
Drop Table Source;
First Step 결과
Hierarchy 함수를 사용한 경우와 비교했을 때, depth 가 3 이상의 경우가 생성되지 않았다.
Depth = 1 인 것 제외하고 결과는 동일함.
최종 Source
// First Step
Tmp_0:
Load 주체,
상대,
상대 As 노드명,
주체 As ParentName,
[주체] As 노드명1,
If (Len(주체) > 0, 상대) As 노드명2,
If (Len(주체) > 0, 2, 1) As Depth
Resident Source;
Drop Table Source;
For x = 1 to vDepth
s = x - 1
y = x + 1;
Tmp_$(x)_Tmp:
Load distinct 노드명$(x) As 노드명$(x)
Resident Tmp_$(s);
Inner Join (Tmp_$(x)_Tmp)
Load distinct 노드명$(y) As 노드명$(x)
Resident Tmp_$(s);
Left Join (Tmp_$(x)_Tmp)
Load *
Resident Tmp_$(s);
vRec = NoOfRows('Tmp_$(x)_Tmp');
If $(vRec) = 0 Then
Drop Table Tmp_$(x)_Tmp;
exit for unless x =1
End If
Tmp_$(x):
Load 주체,
상대,
노드명,
ParentName,
ApplyMap('Map', 노드명$(x), '') As 노드명$(x),
$(x) + 2 As Depth
Resident Tmp_$(x)_Tmp;
For i = 1 to $(y)
j = i + 1;
Left Join(Tmp_$(x))
Load 주체,
상대,
노드명,
ParentName,
ApplyMap('Map', 노드명1, '') As 노드명1,
노드명$(i) As 노드명$(j)
Resident Tmp_$(x)_Tmp;
Next i
Drop Table Tmp_$(x)_Tmp;
Next x
// 데이터 통합 및 임시로 생성된 테이블 삭제
For x = 1 to vDepth + 1
If NoOfRows('Tmp_$(x)') > 0 Then
Concatenate (Tmp_0)
Load * Resident Tmp_$(x);
Drop Table Tmp_$(x);
EndIf
Next x
Test
Source:
Load * Inline [
주체, 상대, 거래금액
A1, B1, 500
B1, C1, 300
C1, D1, 150
C1, E1, 50
D1, F1, 30
];
Qliker 의 Hierarchy Depth=5 인 경우 비교 (OK)
Ver 2
일반적인 경우에는 클릭센스의 Hierarchy 기능으로 수행하면 간단하게 해결할 수 있습니다.
Source
Hierarchy 함수 사용
Hierarchy 함수 결과
'Qlik Sense 개발가이드' 카테고리의 다른 글
스캐터차트를 이용한 Quadrant Analysis(4분면 분석) (0) | 2022.01.12 |
---|---|
병렬로 활성화된 세션이 너무 많기 때문에 Qlik Sense에 액세스 할 수 없습니다. (0) | 2022.01.11 |
Qlik Sense ETL Log 정보 생성 (0) | 2022.01.10 |
대용량데이터에서 일부분적재 (0) | 2022.01.10 |
[클릭센스 개발가이드] 계층별 단가 적용 (0) | 2022.01.08 |