본문 바로가기

Hive, Impala, Tez

[나만을 위한 짧은 이야기] Impala 에서는 UDAF 가 안된다..

쿼리 튜닝을 위해 고민을 하다가 

Hive 가 아닌 Impala 로 쓰기로 결정!


그냥 대놓고 돌렸더니...!!  Syntax 에러가 난다. 


찾아보니... Impala 에서는 UDAF 가 안된다구... 그래서 Hive 에 내장되어 있는 collect_set, collect_list( UDAF )  와 같은 함수는 사용할 수가 없다.


또한, Hive 에 기본으로 내장되어 있는 explode ( UDTF ) 함수 또는  UDF 같은 함수를 바로 쓸수는 없고 java 나 C++ 로 만들어서 쓸수는 있다. 


그러니 아래 쿼리는 Hive 에서만 동작하지 Impala 에서는 동작하지 않는 것이다 ㅠㅠ

SELECT 
	a.uid, 
	collect_list(a.items)
FROM (
	SELECT
		a.items,
		b.uid as uid
	FROM (
		SELECT
			a.uids,
			a.items
		FROM (
			SELECT
				ui.items,
				collect_set(ui.uid) as uids, 
				count(ui.items) as count
			FROM 
			(
				SELECT 
					uid,
					items
				FROM 
					xxx.xxxxx_xxxx_xxxxxxx
				WHERE
					...
				GROUP BY
					uid, items
			) ui
			GROUP BY
				ui.items
		) a
		WHERE a.count >= 4
	) a
	LATERAL VIEW explode(a.uids) b as uid 
) a
GROUP BY
	a.uid
limit 100;