본문 바로가기

Qlik Sense 개발가이드

Network 차트를 작성하기 위한 계층구조 생성

난이도 : 어려움 

작성 배경

//----------------------------------------------------------------------------

//           Hierarchy 함수를 사용하려고 하는데, Depth 가 상당히 많고

//           Node 가 많은 경우 (1백만건 이상) 인 경우 Hierarchy 함수를 사용하기 어렵다.

//           인위적으로 Depth 를 정해서 Hierarchy 구조를 만들고자 한다.

//           Qliker

//----------------------------------------------------------------------------

 

적용 사례

금융정보분석원에서는 2019년부터 2년간 차세대 FIU 정보시스템 구축사업을 수행하였습니다. 본 프로젝트에 통계분석시스템 및 의심계좌 및 의심거래 분석을 위하여 클릭센스(Qlik Sense)의 네트워크 차트를 이용하여 계좌간 연관도 분석을 수행합니다. 네트워크 차트를 생성하기 위해서는 필수적으로 노드(계좌번호) 와 관계가 필요하고, 각 노드는 계층구조로 생성해야 합니다. 그런데 대용량의 노드와 관계를 갖고 있는 경우 Qlik SenseHierarchy 기능으로는 구조를 생성하는데 엄청난 시간이 소요되어서 본 과정의 모델링으로 해결하였습니다

이하 과정은 교육교재를 위하여 작성된 내용입니다.

원본 데이터

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 함수 결과 

 

Hierarchy Make.pdf
0.32MB