hive 에서는 기본적으로 제공되는 함수들이 많이 존재한다. 이것보다 더 다양한 기능을 만들고 싶다면 관련된 추상클래스를 확장해서 개발하고 빌드해서 add jar 를 해서 함수를 써야하는 번거로움이 존재한다. 근데, 단순히 기본으로 제공하는 함수의 조합을 함수와 유사하게 사용하는 방법이 존재한다. 그게 바로 macro 이다. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF LanguageManual UDF - Apache Hive - Apache Software FoundationHive Operators and User-Defined Functions (UDFs) Case-insensitive All Hive keywords a..
복잡한 스키마를 비슷한 목적에 맞게 그룹핑하고 관리하기 위해서 struct 로 필드를 관리할 필요성이 생긴다. 이런 작업은 보통 스키마레지스트리를 통해 관리하고, 데이터를 가공해서 적재할때 default 값에서 일부값만 변경하여 재적재 하고 싶은 경우가 생길수 있다. 하지만 struct 에서 일부값만 바꾸는 기능이 없다. 그래서 개밥먹기로 만들어서 구현했다. hive 3.x 버전 기준으로 빌드했고 hive 4.x 에서도 동작하는데는 큰 무리가 없을것으로 보인다. GenericUDF 를 만들면서 삽질기 사실 처음에 struct 의 리턴값을 List 형태로 만들면 named_struct 함수로 테스트할때 잘 동작했는데, orc 포맷의 테이블에서 사용할때는 내부적으로 OrcStruct 클래스를 사용해서 만들어..
hive 4.x 부터 array 를 다루는 UDF 가 기본 포함되었다. array 에서 특정아이템을 빼거나, 합치거나 이런 기능을 기본적으로 사용가능하다는건데 문제는 azure 도 그렇고 아직 hive 3.x 에 하둡 3.x 버전대가 주류를 이루고 있어서 기본적으로 사용을 못하는게 함정이다. 다행히 github 에 있는 hive 4.x 에서 array 를 다루는 udf 클래스만 추출해서 빌드한걸 테스트해보니 hive 3 버전대에서도 문제없이 동작하는걸 확인했다. 빌드 / 다운로드 UDF 를 빌드하는 방법은 Azure 도큐먼트에 잘 정리되어있다. 나는 이 글을 참고하고 github 에서 관련된 udf 만 추출해서 빌드를 했다. https://learn.microsoft.com/ko-kr/azure/hdin..
hive 에서 array 를 다루는 함수가 기본적으로 너무 없었다. 배열크기를 찾는 size, 배열에 포함여부를 찾는 array_contains, 그리고 배열을 정렬해주는 sort_array 정도만 존재했다. 사실상 explode() 처리후 다시 collect_list() 로 묶어서 처리하라는 말인데... 문제는 2개의 필드를 explode() 해야할 경우 이게 참 껄끄러운 문제가 많고 아쉬운점이 많았다. https://cwiki.apache.org/confluence/display/hive/languagemanual+udf#LanguageManualUDF-CollectionFunctions Hive 4.x 추가된 Array 함수 hive 4.x 버전대부터 꽤 많은 UDF 가 추가되어있다. (근데 왜 h..
brickhouse 는 cookbook 이 정리가 잘 안되어있어서 좋은데도 사용을 잘 못하고 있는게 아닌가 싶다. 이번에는 timeseries 에 있는 함수의 예제를 정리하고자 한다. https://github.com/klout/brickhouse/tree/master/src/main/java/brickhouse/udf/timeseries 1. moving_avg 이동평균값을 구할때 사용한다. 쉽게 생각하면 주식차트에서 7일 이동평균, 30일 이동평균선 같이 평균값을 만들어 내는데 이런 값을 유도한다고 생각하면 된다. 그래서 array 값과 이동평균을 할 값을 지정하면 된다. 내부적으로 double 로 캐스팅해서 계산하므로 항상 소숫점으로 나온다. beeline> CREATE TEMPORARY FUNCT..
hive 의 udf 로 사용하다보면 아쉬운점이 많은데, brickhouse 의 UDF 를 쓰면 가려운 부분을 많이 긁어줘서 편하게 로직을 만들수 있다. 여러 케이스의 udf 가 있지만, 여기서는 json 관련 udf 의 샘플과 예시를 적어두고자 한다. 편의상 add jar 는 되어있다고 가정하겠다. https://github.com/klout/brickhouse GitHub - klout/brickhouse: Hive UDF's for the data warehouse Hive UDF's for the data warehouse. Contribute to klout/brickhouse development by creating an account on GitHub. github.com json 함수는 아..
최근 검색량이 높은 키워드가 무엇인지를 알고 싶을때, flink 에서는 호핑윈도우(슬라이딩 윈도우) 기반으로 지정하고, 슬라이드 사이즈와 데이터 간격을 지정해서 로직을 유도하여 만드는걸 구성했다. 이해를 돕기위해 대충 쿼리를 표현하면 아래와 같다. 하지만, 처음에는 잘 동작하다가 어느순간 backpress 가 발생해서 데이터 지연으로 제대로 처리안되는 문제가 발생했다. INSERT INTO top_keyword_slide ...생략.... FROM TABLE( HOP( DATA => TABLE kafka_log, TIMECOL => DESCRIPTOR(log_time), SLIDE => INTERVAL '30' SECOND, SIZE => INTERVAL '10' MINUTES) ) WHERE valid..
flink 를 쿼리로 작성해서 insert select 형태로 로직이 실행되면 대시보드의 Running Job List 의 이름이 획일적이라 구분이 쉽지 않다. 특히 동일한 테이블에서 조건만 다르게 N개의 로직을 돌리면 작업이름으로는 구분이 안되는 문제가 존재한다. 이런 문제를 해결하기위해서 쿼리 실행전에 작업이름을 지정하여 해결하는것이 가능하다. insert-into_카탈로그명.데이터베이스명.테이블명 해결방법 다음과 같이 insert select 쿼리를 실행하기전에 SET 'pipeline.name' 형태로 이름을 지정하면 된다. 그러면 insert-into-default_catalog.default_database... 같은 이름이 아니라 사용자가 지정한 작업이름으로 등록된다. SET 'pipelin..