본문 바로가기

분류 전체보기

hive lateral view 아래와 같은 hive의 테이블 데이터가 있다. name start_date end_date P 2017-10-11 2017-10-13 D 2017-10-11 2017-10-12 위 테이블의 start_date와 end_date의 데이터를 이용하여 사용자별로 해당 기간을 아래 표 처럼 row형태로 데이터를 추출하는 방법을 고민해보았으나 쉽지 않았다. name date P 2017-10-11 P 2017-10-12 P 2017-10-13 D 2017-10-11 D 2017-10-12 oracle이라면 connect by를 사용하거나 하면 해결이 될 것 같았는데 hive sql은 connect by가 지원하지 않더라.이것저것 찾다보니 hive lateral view라는 기능이 있어 해결한 방법을 공유한다. l.. 더보기
Underscore.js를 이용하여 javascript Array Merge하기 기존 Array에 신규 Array값을 Merge하려면 for loop를 돌면서 키값을 비교하며 교체하는 방법은 있으나그런 날코딩(?)은 너무 우아하지 않아서 찾아보니 Underscore.js로 가능하더라. 기존 Array로 Merge대상var ori = [{"KEY": "A", "VALUE" : 1 }, {"KEY": "B", "VALUE" : 2 }, {"KEY": "C", "VALUE" : 3 },{"KEY": "D", "VALUE" : 4 }]; 신규 Arrayvar inp = [{"KEY": "D", "VALUE" : 44 },{"KEY": "E", "VALUE" : 5 }]; 신규 Array의 각 Object의 "KEY"값을 기준으로 기존 Array를 추가하거나 변경하는 작업으로 원하는 결과 값.. 더보기
Hive GROUP_CONCAT Hive에서 GROUP_CONCAT를 사용하고자 한다면 아래와 같이 사용할 수 있다. 123SELECT GROUP_COL CONCAT_WS('|', COLLECT_SET(CONCAT_COL))FROM TABLE_NAMEGROUP BY GROUP_COLColored by Color Scriptercs 끝. 더보기
R grep을 이용한 데이터프레임 필터링 R의 주요 데이터포맷인 데이터프레임(data.frame)을 사용하다보면 필터링을 해야 되는 경우가 많다. 필터링하는게 어렵지는 않지만 데이터프레임의 데이터가 많을 수록 성능이슈가 발생한다. 데이터가 클수록 필터링 속도는 현저하기 느려진다. 물론 이러한 성능이슈를 도와주는 R의 여러 패키지가 존재하며 대표적으로 data.table 패키지가 있다. 해당 패키지는 RDBMS와 유사하게 데이터를 인덱싱하여 보다 빠른 필터링 및 그외 여러기능을 제공한다. (더 자세히 알고 싶다면 여기를 참고) 여기서는 data.table과 같은 패키지를 사용하지 않고 보다 빠르게 필터링 하는 방법을 알아보고자 한다. 우선 기본적인 R에서 데이터프레임을 필터링하는 방법으로는 아래 2가지가 대표적(?)이다. df1 더보기
R을 이용한 이상치 분석 이상치(Outlier)라고 하면 특정 데이터 변수의 분포에서 비정상적으로 벗어난 값을 뜻한다.예를 들면 어떤 학생이 신체검사를 했다고 치자 A학생은 몸무게와 키가 각각 100kg, 150cm나왔다.이 A학생은 일반적으로 생각했을때 키에 비해 몸무게가 많은 것으로 보인다. (여기서는 몸무게와 키는 상관관계가 높은 것으로 간주한다.)그럼 이 A학생은 속한 학년 반 또는 또래 아이들에 비해 비정상(여기서 이상치)이 맞을까? 위 질문에 대한 이상치 분석을 한번 해보자.이상치 분석을 위한 모델 데이터는 A학생이 포함된 반의 학생들의 몸무게, 키 데이터이며 변수는 몸무게, 키로만 한정지어 분석해보고자 한다. 모델에 대한 종속변수는 몸무게이며 설명변수는 키가 된다. 우선 데이터를 한번 만들어보자.(실제 데이터가 없으.. 더보기
MySQL(MariaDB) 사분위수 구하기 특정 데이터 분포를 쉽게 확인할 수 있는 수치로는 최소값, 중간값, 평균값, 최대값 그리고 사분위수가 있다.사분위수는 데이터의 균등한 분할로 25%, 50%, 75%, 100%를 나타내며 1사분위수(1Q)는 25% 값에 해당한다. 사분위수를 알아내면 BOXPLOT과 같은 Chart를 통해 데이터 분포를 시각화 할 수 있을 것이다.아쉽게도 R과 같은 통계언어의 경우는 쉽게 사분위수를 구할 수 있으나 MySQL의 경우는 지원하는 내장함수가 존재하지않는다. 그래서 SQL를 통해 사분위수를 구할 수 있는 방법을 알아 보고자 한다. boxplot 해석을 돕기 위한 그림(출처) SET GROUP_CONCAT_MAX_LEN = 10485760; SELECT MIN(COLUMN_NAME) AS 'MIN', SUBSTR.. 더보기
R on Hadoop and Amazon EMR Amazon EMR은 R을 지원한다. AMI Versions 3.0.0 이상부터는 Hadoop과 함께 R 3.0.2버전이 함께 Includes되어 설치된다. 현재 R최신버전은 3.1.1이지만 R 3.0.2버전이면 거의 최신버전이라고 할 수 있다. Amazon 서비스에서 R을 지원하기 때문에 EMR을 이용하여 R Script를 실행하는 방법을 알아보고자 한다. 우선 고려해야 될 사항을 나열해보면 아래와 같다. 첫째 AMI를 통해 설치되는 R버전이 내가 사용하고자 하는 R package에서 지원하는 버전대인지? 둘째 EMR Hadoop Cluster 세팅 시 R은 설치 되지만 R Package는 설치되지 않기 때문에 설치가 가는한지? 우선 첫번째 문제부터 살펴보면 R 3.0.2버전이면 거의 왠만한 R pac.. 더보기
맵리듀스에서 RDBMS로 인서트 시 GC overhead limit exceeded Issue 맵리듀스에서 리듀스 출력결과를 RDBMS로 저장 시 GC overhead limit exceeded Issue가 발생한다.해당 Issue는 리듀스 출력결과가 즉 RDBMS로 저장되어야 하는 데이터가 많은 경우 발생하게 된다. 맵리듀스에서 RDBMS로 Insert하기 위해 org.apache.hadoop.mapreduce.lib.db.DBOutputFormat(링크)를 사용한다. 해당 소스를 까보면 리듀스 출력결과로 Insert문자열을 생성하여 addBatch()로 보관 후 DB Connection이 close될때 executeBatch()가 실행되고 commit()이 실행된다. 즉 대량의 데이터가 한번에 Insert되는 것이다.해당 Issue와 관련해서 Cloudera블로그에도 관련 글이 존재한다. (링.. 더보기
AWS JAVA SDK를 이용한 EMR(Elastic MapReduce) Job Flow 생성 및 실행 AWS JAVA SDK를 이용하여 개발한 MapReduce를 EMR Custom Jar로 등록하여 Job Flow를 생성 및 실행하는 방법이다. private static final String EMR_SETUP_NAME = "Setup hadoop debugging"; private static final String HADOOP_SETUP_JAR = "s3://elasticmapreduce/libs/script-runner/script-runner.jar"; private static final List HADOOP_SETUP_ARGS_AS_LIST = Arrays.asList("s3://elasticmapreduce/libs/state-pusher/0.1/fetch"); private static .. 더보기
S3 전체 파일 리스트 가져오기 S3 특정 bucket에 저장된 Object 파일리스트 목록을 가져올때 아래와 같이 코딩을 할 수 있다. AWSCredentials crd = new BasicAWSCredentials(accessKey, secretKey); AmazonS3 s3 = new AmazonS3Client(crd); ObjectListing objects = s3.listObjects(bucketName, folderName); do { //1000개 단위로 읽음 for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { } objects = s3.listNextBatchOfObjects(objects); 더보기