hive 쿼리를 다루다보면 array, map 같은 데이터 타입이 존재하는데, 이런 데이터를 다룰때 기본적으로는 explode() 후 처리하는것이 기본적인 접근방식이다. 1. hive 기본 array 함수 별도의 jar 를 추가할 필요없이 hive 에서 기본으로 제공하는 array 관련 함수이며, 관련된 내용은 아래 링크에 정리되어있다. https://cwiki.apache.org/confluence/display/hive/languagemanual+udf 1.1 size 배열의 사이즈를 구하는 함수이다. beeline> select size( array(1,2,2,3) ); +------+ | _c0 | +------+ | 4 | +------+ 1.2 array_contains 배열에 특정한 아이템이..
hive 에서는 string, bigint, double, decimal 같은 일반적인 primitive 데이터 타입이외에 map, struct, array 같은 complex type 을 지원한다. 테스트용 쿼리를 만들때 primitive 타입의 경우 쉽게 표현이 가능한데 complext type 을 표현하는 방법은 종종 헛갈릴때가 많아서 간단히 표현법을 다루고자 한다. hive 에서는 기본적으로 "select 값" 형태로 더미 값을 출력해보는게 가능한데, complext type 을 선언하여 보는건 아래와 같이 사용하면 된다. 참고로 array 와 같이 N개의 아이템을 풀어서 분석하려면? explode 를 이용해 분석하면 되는데, 그건 아래 글을 참고하도록 하자. 2023.11.27 - [데이터처리/..
하둡 데이터를 다루다보면, 종종 다른팀의 하둡클러스터의 데이터를 복제해와야 할 경우가 존재한다. 이때, 네임노드와 호스트(혹은 ip) 와 포트를 이용해서 연결하는게 가능한데, 문제는 active, stand by 서버가 변경되면 연결이 안되는 상황이 발생되는 문제가 존재한다. 이런 문제를 해결하려면 nameserivce 정보를 hdfs-site.xml 에 추가해서 사용하는게 좋다. 근데, 1회성 작업이거나 연결가능여부를 테스트하기위해서 설정을 변경해보는건 꽤 번거로운 작업이 된다. 이럴때 사용할 수 있는 방법은 hadoop 명령어를 날릴때 -D 옵션을 이용해 해당 정보를 인자값으로 직접 넣어주는것이다. 2021.11.18 - [데이터처리/Hadoop] - [팁] 다른 hdfs 클러스터의 nameservi..
external table 로 테이블을 만들어 관리할때, table 이름을 rename 해도, 폴더가 테이블명에 맞춰서 수정되지 않는다. 그렇다고 테이블의 location 속성의 경로를 수정해도, 파티션 테이블인 경우 인지가 안되는 문제가 존재한다. location 까지 세트로 변경이 안되면, hdfs 에서 직접 데이터를 바라보는 사람은 테이블명과 다르면 혼란이 올 수 있기 때문에 완벽하게 테이블명과 location 의 폴더명도 세트로 변경하고 싶은 경우를 의미한다. 문제예시 예를 들면 아래와 같다. location 폴더를 백업폴더로 이동하고, table 의 location 을 이동시킨 폴더로 변경하더라도 바로 조회되지 않는다. 테이블이 아닌 파티션별 location 을 변경해야 한다. 문제는 이런 파티..
hive 에서는 Array 형태의 데이터를 풀어서 ROW 로 풀어내는게 가능하다. 이때 사용하는문법이 explode 이다. posexplode 는 무엇이냐? 인덱스번호까지 알아야할 경우가 종종 있는데 이때는 posexplode 를 쓰면 된다. 이해를 돕기위해 아래와 같은 데이터가 존재한다고 가정하자. (v_sample) beeline> select * from v_sample; +------------------+-------------------------+ | v_sample.tags | v_sample.title | +------------------+-------------------------+ | ["fun","happy"] | hello! my name is haha | | [] | test..
참고로 아래와 같이 security.protocol 이 SASL_PLAINTEXT kafka 를 연동했을때 나타났던 문제이다. kafka 의 토픽을 맵핑한 ddl 문과 에러메시지 이다. beeline> CREATE EXTERNAL TABLE kafka_table ( foo STRING, bar STRING ) STORED BY 'org.apache.hadoop.hive.kafka.KafkaStorageHandler' TBLPROPERTIES ( "kafka.bootstrap.servers" = "10.1.1.1:9092", "kafka.topic" = "sample_topic", "kafka.serde.class" = "org.apache.hadoop.hive.serde2.JsonSerDe", 'kafk..
hive 에서 kafka 를 쉽게 연동해서 사용할 수 있어서, 꽤 유용하게 쓸수 있다. 그런데, 하둡클러스터는 kerberos 인증을 사용하고 kafka 는 다른 인증방식을 사용할 경우 어떻게 사용해야하는지 readme.md 문서를 뒤져봐도 친절하지가 않다. 그래서 관련된 선언방법과 주의사항을 안내하려고 한다. https://github.com/apache/hive/blob/master/kafka-handler/README.md 문제점 우선 org.apache.hadoop.hive.kafka.KafkaStorageHandler 를 사용가능하다는 전제로 설명하도록 하겠다. 보통 kafka 의 인증정보를 다음과 같이 표현하여 사용하는데... 아래 정보를 table 선언할때 어떻게 맵핑하는지 정리가 안되어있어..
사실 Kafka 의 데이터를 활용할 때, KafkaStrems 를 사용해서 consumer 를 만들거나, ksql 을 쓰거나 혹은 spark 를 쓰는게 일반적이다. 하지만, 실시간성으로 데이터를 다루는게 아니라, 조금 지연되더라도 배치기반으로 처리하고, 그 결과를 아카이빙 할 수 있도록 유지보수하는 요구사항도 꽤 많은데 이럴때는 기냥 hive 에서 KafkaStorageHandler 를 사용하는게 훨씬 간편하다. 기본내용 hive 에서 KafkaStorageHandler 를 사용하는건 아래 문서를 참고하면 된다. https://github.com/apache/hive/blob/master/kafka-handler/README.md 보통 kafka 에 데이터를 적재할때, JSON 과 AVRO 포맷을 많이 ..