반응형

아래와 같은 데이터에서 선생님별 학생리스트가 아닌 1-1 matching된 multi row로 만들 때 보통 lateral view explode()를 사용한다. 하지만 주의할게 explode() udf는 아래와 같이 array형태나 mpa as a parameter형태만 지원한다.

teacher student_id_list
teacher1 [1,2,3]

table : class

$ SELECT teacher, id from  class LATERAL VIEW explode(student_id_list) ids AS id where adid='teacher1';

위처럼 lateral view explode 을 실행하면 아래처럼 muliti row 형태로 변환된다.

teacher student_id_list
teacher1 1
teacher1 2
teacher1 3

하지만 student_id_list가 String 형태로 되어있다면?

teacher student_id_list
teacher1 1,2,3

위에서 언급한 것 처럼 explode()는 array형태나 map as a parameter형태의 데이터에만 지원되기 때문에 다음과 같이 처리해준다.

$ SELECT teacher, id from  class LATERAL VIEW explode(student_id_list, ',') ids AS id where adid='teacher1';

이렇게 해주면 explode를 String format에서도 사용할 수 있다. 

결과는 동일하다.

반응형
반응형

최근 hive와 impala query를 만지게 되면서 hive udf를 impala에 등록할 일이 생겼는데


hive에서 udf를 등록할 때의 명령어가 먹지 않아 약간의 삽질을 하였다.


사용한 udf는 string을 입력받아 잘게 쪼개어 다시 string을 반환하는 역할이었다.


[ Hive UDF create command ]

hive> create function ad_get as 'com.data.udf.AdGet' using jar 'hdfs:///user/hive/lib/hive-udf.jar';

ad_get => hive에서 udf로 사용할 명칭
com.data.udf.AdGet => jar에서 udf로 등록할 클래스명칭

hdfs:///user/hive/lib/hive-udf.jar => jar hdfs path



[ Impala UDF create command ] 

Impala는 hive udf create 명령과는 다르게 해당 udf의 return 타입과 input타입을 명시해 주어야 한다.

create function ad_get(string, string, string) returns string location 'hdfs:///user/hive/lib/hive-udf.jar' symbol='com.data.udf.AdGet';


ad_get(string, string, string) => impala에서 udf로 사용할 명칭(string arg 3개를 입력 받는다)

returns string => 리턴타입 지정

symbol='com.data.udf.AdGet' => jar에서 udf로 등록할 클래스명칭

location 'hdfs:///user/hive/lib/hive-udf.jar



impala에 해당 명령어로 udf를 등록한 후 show functions 명령을 내려 보면 잘 등록되었는지 확인이 가능하다.


감사합니다:)


반응형

+ Recent posts