hive PTF-WINDOWING

2015.01.22 11:12

까먹기 전에..

TABLE-DEF 는 WINDOW-DEF 와 PTF-DEF 로 나뉜다. WINDOW-DEF 는 일반적인 윈도우 선언을 사용하는 function 들이고 PTF-DEF 는 사용자가 임의의 테이블을 만들어 내는 function 으로 script operator 와 동일한 성격을 가진다고 보면 된다 (noop/noopwithmap/matchpath 등이 있는데 몇개 없음). OpConf 내의 정의와 실제 evaluation 되는 순서는 반대이므로 주의.

PartitionedTableFunctionDef : TABLE-DEF2 -> TABLE-DEF1 -> INPUT-TABLE

PTFInvocation : INPUT -> TABLE-DEF1 -> TABLE-DEF2

* 기본적으로 각 DEF 에 대해 start-partition -> process-row* -> finish-partition 순서로 진행

target partition 이 처리되는 방식에 따라 input streaming mode 와 non-input-streaming mode 로 나눌 수 있다. input streaming 은 partition 내의 row 를 하나씩 넣으면서 결과를 뽑아내는 방식이고 non-input-streaming 는 전체 파티션을 다 읽어 partition iterator 를 만든 후 이를 처리하는 방식이다. 이 중에 input streaming mode 가 좀 더 효율적이라 할 수 있다. non-input-streaming mode 는 결과값을 만들어 내는 방식에 따라 다시 iterator-out mode 와 partition-out mode 로 나뉜다.

우선 TABLE-DEF 들이 input streaming mode 가 가능 한지를 검사 (TableFunctionEvaluator.setCanAcceptInputAsStream()) 하여 모든 하위 function 들이 아래와 같은 범주에 속하는 경우에는 input streaming mode 를 적용할 수 있다.

1. The Function implements ISupportStreamingModeForWindowing 

2. Or returns a non null Object for the getWindowingEvaluator, that implements ISupportStreamingModeForWindowing. 

3. Is an invocation on a 'fixed' window.  So no Unbounded Preceding or Following.

non-input-streaming mode 의 경우 output 을 iterator 방식으로 줄 수 있는지를 조사한다. WINDOW-DEF 와 input-streaming 이 가능 한 모든 TABLE-DEF 들이 iterator 방식에 속한다. input 은 partition iterator 로 동일하지만 output 방식에 따라 호출되는 메쏘드가 다르다.

partition-out : execute(PTFPartitionIterator<Object> pItr, PTFPartition outP))

iterator-out : Iterator<Object> iterator(PTFPartitionIterator<Object> pItr)

최악의 경우 function * partition row 의 evaluation 이 일어나며 function * partition row ^2 의 컬럼 억세스가 발생한다. 


실제 값을 evaluation 하는 방법은 function 의 종류에 따라 달라지며, 아래와 같이 총 3 가지가 있다.

streaming function

non-streaming function : pivot + non-pivot

streaming function 이라도 외부 조건에 따라 non-streaming 방식으로 사용 될 수 있으며, 이 function 이 pivot 이 가능하다면 non-streaming pivot function 으로 간주된다. (non input-streaming mode에서 getRowsRemainingAfterTerminate() 가 0 이 아닌 경우. input streaming  mode 에서는 항상 사용 가능)

streaming function 의 경우 process-row 에서 들어오는 row 값으로 그때 그때 evaluation 한다. 이때 function 의 특성에 따라 결과가 바로 나올 수도 있고 안나올 수도 있는데 (window frame 이 following X 가 있는 경우), 결과값이 나오면 이 값을 다음 TABLE-DEF 로 넘겨서 계속 evaluation 을 진행한다. 이경우 마지막 finish-partition 이 호출될 때에 나머지 결과값들이 나오게 된다. input-streaming mode 에서는 이러한 방식이 가능하지만 non input-streaming mode 에서는 현재 불가능 하다.

non-streaming/pivot function 은 PTFPartitionIterator 에 대한 결과 값을 전체 LIST 형태로 반환하는 것으로 앞서 설명한 것 처럼 streaming 타입으로 처리하는 것이  불가능 한 경우에 사용된다. 전체 파티션에 대한 해당 컬럼의 결과는 한번 evaluation 되어 LIST 형태로 저장되며, 여기에서 값을 하나씩 꺼내 가는 방식으로 동작한다. pivot 타입이 아닌 경우 이는 전체 partition 에 대해 동일한 결과를 내는 함수로 것으로 간주되며, 한번 evaluation 된 값이 모든 row 에 동일하게 적용된다. 

non-streaming/non-pivot function 은 row index 가 증가할 때 마다 그에 맞는 범위의 partition iterator 를 생성하며, 이 범위의 모든 값을 iterate + terminate 한 결과값을 반환한다.

1. partition out 의 경우 조건상 streaming 을 사용할 수 없다. 

streaming 타입으로 처리하는 것이 가능한 경우는 결과 Iterator 내에서 next 가 호출될 때 값이 evaluation 된다. 




신고
Posted by navis94

카테고리

분류 전체보기 (31)
Apache Hive (29)

최근에 달린 댓글

최근에 받은 트랙백

태그목록

달력

«   2017/11   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

티스토리 툴바