기존 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 }

];


신규 Array

var inp = [

{"KEY": "D", "VALUE" : 44 },

{"KEY": "E", "VALUE" : 5 }

];


신규 Array의 각 Object의 "KEY"값을 기준으로 기존 Array를 추가하거나 변경하는 작업으로 원하는 결과 값은 아래와 같다.


[

{"KEY":"A","VALUE":1},

{"KEY":"B","VALUE":2},

{"KEY":"C","VALUE":3},

{"KEY":"D","VALUE":44},

{"KEY":"E","VALUE":5}

]


Underscore.js의 uniq, union 메서드를 조합하면 원하는 결과 값을 얻을 수 있으며 아래 소스상에서 sortBy메서드는 Object의 "KEY" 값 정렬을 위해 사용되었다.


_.sortBy(

_.uniq(

_.union(inp, ori), false, function(item, ori){ return item.KEY; }

)

, "KEY");




저작자 표시
신고

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Hive GROUP_CONCAT

rdb 2015.04.09 14:46

Hive에서 GROUP_CONCAT를 사용하고자 한다면 아래와 같이 사용할 수 있다.


1
2
3
SELECT GROUP_COL CONCAT_WS('|', COLLECT_SET(CONCAT_COL))
FROM TABLE_NAME
GROUP BY GROUP_COL
cs


끝.

저작자 표시
신고

'rdb' 카테고리의 다른 글

Hive GROUP_CONCAT  (0) 2015.04.09
MySQL(MariaDB) 사분위수 구하기  (0) 2014.09.02
Oracle FlashBack  (0) 2011.04.05
DB 파티셔닝  (0) 2011.03.07

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R의 주요 데이터포맷인 데이터프레임(data.frame)을 사용하다보면 필터링을 해야 되는 경우가 많다.

필터링하는게 어렵지는 않지만 데이터프레임의 데이터가 많을 수록 성능이슈가 발생한다.


데이터가 클수록 필터링 속도는 현저하기 느려진다.

물론 이러한 성능이슈를 도와주는 R의 여러 패키지가 존재하며 대표적으로 data.table 패키지가 있다.

해당 패키지는 RDBMS와 유사하게 데이터를 인덱싱하여 보다 빠른 필터링 및 그외 여러기능을 제공한다.

(더 자세히 알고 싶다면 여기를 참고)


여기서는 data.table과 같은 패키지를 사용하지 않고 보다 빠르게 필터링 하는 방법을 알아보고자 한다.

우선 기본적인 R에서 데이터프레임을 필터링하는 방법으로는 아래 2가지가 대표적(?)이다.


df1 <- data[data$col1=='filter조건',]
df2 <- subset(data, col1=='filter조건') 


위와 같은 방법 data 데이터 사이즈가 500만건 정도의 데이터를 필터링 했을 경우 하드웨어 사양에 따라 조금씩 차이는 있겠지만 대략 두 방법 모두 10초 가량 소요가 되었다.


꽤 오랜시간이 소요되어 고민하던 차에 R에서 grep을 지원하는게 생각나서 아래와 같이 테스트를 해보았다.


df3 <- data[grep('filter조건', data$col1, ignore.case=T),]


테스트 결과 위 두가지 필터보다 50%이상 성능이 빠르게 나왔다.


내부적으로 어떤 차이가 있는지 좀 더 알아보고 싶지만 머 grep이니까 빠르겠지... 하고 쓴다...@.@;


끝.

저작자 표시
신고

'R' 카테고리의 다른 글

R grep을 이용한 데이터프레임 필터링  (0) 2014.10.22
R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret


이상치(Outlier)라고 하면 특정 데이터 변수의 분포에서 비정상적으로 벗어난 값을 뜻한다.

예를 들면 어떤 학생이 신체검사를 했다고 치자 A학생은 몸무게와 키가 각각 100kg, 150cm나왔다.

이 A학생은 일반적으로 생각했을때 키에 비해 몸무게가 많은 것으로 보인다. 

(여기서는 몸무게와 키는 상관관계가 높은 것으로 간주한다.)

그럼 이 A학생은 속한 학년 반 또는 또래 아이들에 비해 비정상(여기서 이상치)이 맞을까?


위 질문에 대한 이상치 분석을 한번 해보자.

이상치 분석을 위한 모델 데이터는  A학생이 포함된 반의 학생들의 몸무게, 키 데이터이며 변수는 몸무게, 키로만 한정지어 분석해보고자 한다. 모델에 대한 종속변수는 몸무게이며 설명변수는 키가 된다.


우선 데이터를 한번 만들어보자.(실제 데이터가 없으니 ^^;)



name,weight,tall

A,100,150

B,55,156

C,50,153

D,54,165

E,70,164

F,56,155

....생략....

Y,49,153

Z,43,151


 


 std.data <- read.csv("outlier.csv", header=T)
summary(std.data)
boxplot(std.data$weight)

우선샘플 데이터를 R에서 가져와 데이터 분포와 몸무게에 대한 boxplot을 확인해보자.


boxplot을 통해보면 상단 whisker의 몸무게 70kg이상은 이상치라고 판단하고 있으며 해당 데이터에서는 위 boxplot에서 100kg은 이상치라고 판단했다. boxplot에서의 이상치는 몸무게 데이터간의 이상치라고 볼 수 있다.

몸무게와 키와의 상관관계가 있다고 가정하며 키가 클수록 몸무게도 커지기 때문에 몸무게 변수하나로 이상치를 판단하기는 좀 무리가 있을 수 있겠다. (저 몸무게 100kg의 학생이 키가 2m일 수도 있지 않나?? ㅡㅡ;)


그렇다면 설명변수 키와 종속변수 몸무게를 이용하여 회귀분석 모델을 생성하여 이상치를 팓단해보자.

회귀분석 lm함수를 이용하여 lm(종속변수 ~ 설명변수, 모델데이터)로 회귀분석 모델을 생성한다.

library(car)
std.lm <- lm( weight ~ tall , data = std.data)
summary(std.lm)
outlierTest(std.lm)
std.data[1,]

생성한 회귀분석 모델에 의한 이상치 판단을 하기 위해 outlierTest 함수를 사용한다.

해당함수는 모델에 대한 이상치 데이터를 각종 수치와 함께 쉽게 나타내 준다. 단 해당 함수는 car 패키지를 설치 후 사용가능하다. 실행 결과를 보면 아래와 같다.


> outlierTest(std.lm)
  rstudent unadjusted p-value Bonferonni p
1  7.62756         9.6225e-08   2.5018e-06
> std.data[1,]
  name weight tall
1    A    100  150

std.data에서 1번째 데이터가 이상치라고 판단했으며 해당 데이터를 확인해보니 A학생으로 나오는 것을 확인할 수 있다.


전체 실행코드



지금까지 정말 정말 간단한 말도 안되는 데이터를 가지고 이상치 분석을 해보았다... ^^;

그렇다면 이상치 분석은 어떻게 활용할 수 있을까? 

데이터만 가지고 있다면 어디든 활용할 수 있을 것이다. 예를 들면 상품에 대한 가격 이상치라던지 서버 모니터 정보를 이용한 이상치 등등...


물론 실제 많은 설명변수들이 존재하는 데이터를 가지고 이상치 분석을 하기는 쉽지 않다.

데이터 전처리도 쉽지 않고 위에서 설명하지 않은 회귀분석 모델, outlierTest함수를 통해 나온 수치해석 등 통계적 지식이 꽤 많이 필요한 건 사실이지만... 재미로 내가 몸담고 있는 회사의 데이터를 가지고 테스트 해보는 것도 나쁘지 않겠다.

끝.

저작자 표시
신고

'R' 카테고리의 다른 글

R grep을 이용한 데이터프레임 필터링  (0) 2014.10.22
R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

특정 데이터 분포를 쉽게 확인할 수 있는 수치로는 최소값, 중간값, 평균값, 최대값 그리고 사분위수가 있다.

사분위수는 데이터의 균등한 분할로 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',
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 5/100 * COUNT(*) + 1), ',', -1)  AS `5TH PER`,
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 25/100 * COUNT(*) + 1), ',', -1)  AS `1ST QU`,
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 50/100 * COUNT(*) + 1), ',', -1)  AS `MEDIAN`,
AVG(COLUMN_NAME) AS 'MEAN',
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 75/100 * COUNT(*) + 1), ',', -1)  AS `3RD QU`,
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 95/100 * COUNT(*) + 1), ',', -1)  AS `95TH PER`,
MAX(COLUMN_NAME) AS 'MAX'
FROM TABLE_NAME

원리는 간단하다. GROUP_CONCAT 함수로 데이터를 합쳐서 분위수에 해당하는 수치를 구해 SUBSTRING_INDEX함수로 데이터를 추출하는 방법이다. 참 쉽죠? 

아! 그리고  합쳐지는 데이터가 많을 경우 꼭 SET GROUP_CONCAT_MAX_LEN = 10485760; 와 같은 설정이 필요함


끝.

참고 : http://web.performancerasta.com/metrics-tips-calculating-95th-99th-or-any-percentile-with-single-mysql-query/



저작자 표시
신고

'rdb' 카테고리의 다른 글

Hive GROUP_CONCAT  (0) 2015.04.09
MySQL(MariaDB) 사분위수 구하기  (0) 2014.09.02
Oracle FlashBack  (0) 2011.04.05
DB 파티셔닝  (0) 2011.03.07

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R on Hadoop and Amazon EMR

R 2014.08.19 15:44

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 package는 사용가능하다. 

rdocumentation.org 에서 제공하는 R package rank내의 ggplot2, plyr등 모두 사용가능하며 이슈는 없다.

둘째로는 사용하고자 하는 R package가 설치가 가능한지인데 이 부분도 EMR에서는 Bootstrap Actions라는 기능이 있다. 해당 기능을 통해서 R package뿐만 아니라 기타 여러 패키지가 설치 가능하다.


그럼 이제 EMR에서 R Script를 실행하는 방법을 알아보자.


AMI version

위에서 언급한 바와 같이 3.0.0이상 가장 최신버전을 선택하도록 하자.


Bootstrap Actions

Bootstrap Custom Actions을 통해 R Script에서 사용할 package와 기타 필요한 패키지들을 설치할 수 있도록 해야 한다.

여기서는 R package 하나와 mysql을 설치하도록 지정했다.

아래와 같이 shell script파일을 생성한다.

 
#!/bin/bash
sudo yum -y install mysql mysql-server mysql-connector-odbc mysql-devel
wget http://cran.r-project.org/src/contrib/DBI_0.2-7.tar.gz
sudo R CMD INSTALL DBI_0.2-7.tar.gz

만약 설치되어야 하는 R package가 많다면  아래와 같이 RScript Install.package구문으로도 가능하다.

 
 sudo Rscript -e "install.packages(c('DBI', 'rJava', 'etc'),repos='http://ftp.heanet.ie/mirrors/cran.r-project.org/')"

mysql설치는 apt-get 명령어가 아닌 yum을 사용했다. AMI 3.x대 버전 이후 부터는 apt-get이 아닌 yum을 이용하여

필요한 패키지들을 설치할 수 있다. 해당 shell script를 S3내의 내 버킷공간에 저장해 둔다.


S3에 저장한 shell script를 S3 location에 Path를 지정한 후 Add해주면 Bootstrap Action설정은 모두 끝난다.


Steps

R Script 작성 시 맨 상단에 "#! /usr/bin/env Rscript" 해당 구문을 추가해주어야 한다.

추가하지 않으면 EMR에서 R Script를 해석하지 못한다.

#! /usr/bin/env Rscript
library(DBI, quietly=TRUE)
.....

실행할 R Script를 Bootstrap의 Shell script와 마찬가지로 S3내의 내 버컷공간에 저장해 둔다.

그리고 Streaming program을 선택 후 Step을 추가해주면 된다.



Mapper, Reduce에서 싫행될 R Script를 각각 지정 후 Input, Output 장소도 지정한다.

Output의 경우 Reduce에서 실행되는 R Script의 실행 결과물이 파일로 저장된다.



위와 같이 최종 설정 후 Create cluster를 생성하면 EMR내에서 R Script가 실행가능하다.



참고
http://www.joyofdata.de/blog/mapreduce-r-hadoop-amazon-emr/
https://forums.cascading.io/index.php?/topic/9-unable-to-run-emr-bootstrapscript/
http://mrjob.readthedocs.org/en/latest/guides/emr-bootstrap-cookbook.html#ami-2-x-and-ami-3-x-version-differences


저작자 표시
신고

'R' 카테고리의 다른 글

R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

맵리듀스에서 리듀스 출력결과를 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블로그에도 관련 글이 존재한다. (링크)


이 문제를 해결하기 위해 DBOutputFormat을 상속받아 삽질을 했으나 해결방법은 의외로 간단하다.


    public static final int batchSize = 5000;
    public static int count = 0;

    public static class DBOutputWritable implements Writable, DBWritable {
        String col1, col2;

        public DBOutputWritable(String col1, String col2) {
            this.col1 = col1;
            this.col2 = col2;
        }

        public void readFields(DataInput in) throws IOException {}

        public void readFields(ResultSet rs) throws SQLException {
            col1 = rs.getString(1);
            col2 = rs.getString(2);
        }

        public void write(DataOutput out) throws IOException {}

        public void write(PreparedStatement ps) throws SQLException {
            ps.setString(1,col1);
            ps.setString(2,col1);
            
            if(++count % batchSize == 0) {
                ps.executeBatch();
                count=0;
            }
           
        }
    }
DBOutputWritable에서 write메소드에서 데이터 단위를 나누어 주면된다. 

끝.


저작자 표시
신고

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

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<String> HADOOP_SETUP_ARGS_AS_LIST = Arrays.asList("s3://elasticmapreduce/libs/state-pusher/0.1/fetch");
private static final String HADOOP_VERSION = "하둡버전";
private static final int INSTANCE_COUNT = 4;   //master 1개, slave 3개
private static final String INSTANCE_TYPE = InstanceType.C3Xlarge.toString();
private static final String FLOW_NAME = "FLOW_NAME";
private static final String EMR_NAME = "EMR_NAME";
private static final String S3N_HADOOP_JAR = "s3n://버킷이름/폴더명/커스텀.jar";
private static final String S3N_LOG_URI  = "s3://버킷이름/Log/";
private static final String[] JOB_ARGS = new String[] { "" };
private static final List<String> ARGS_AS_LIST = Arrays.asList(JOB_ARGS);
private static final List<JobFlowExecutionState> DONE_STATES = Arrays.asList(new JobFlowExecutionState[] { JobFlowExecutionState.COMPLETED,
                                             JobFlowExecutionState.FAILED,
                                             JobFlowExecutionState.TERMINATED });

static AmazonElasticMapReduce emr;
private static void init() throws Exception {
    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    emr = new AmazonElasticMapReduceClient(credentials);
}

public static void main(String[] args) throws Exception {
    init();
    try {
        JobFlowInstancesConfig instances = new JobFlowInstancesConfig();
        instances.setHadoopVersion(HADOOP_VERSION);
        instances.setInstanceCount(INSTANCE_COUNT);
        instances.setMasterInstanceType(INSTANCE_TYPE);
        instances.setSlaveInstanceType(INSTANCE_TYPE);
        /*각종 Job Flow 설정 추가 ex) instances.setTerminationProtected(true); */

        RunJobFlowRequest request = new RunJobFlowRequest(FLOW_NAME, instances);
        request.setLogUri(S3N_LOG_URI);

        //step 추가로 초기 서버에 하둡을 세팅하기 위한 step이다.            
        HadoopJarStepConfig jarConfig_setting = new HadoopJarStepConfig(HADOOP_SETUP_JAR);
        jarConfig_setting.setArgs(HADOOP_SETUP_ARGS_AS_LIST);
        StepConfig stepConfig_setting = new StepConfig(EMR_SETUP_NAME, jarConfig_setting);
        //custom jar step추가
        HadoopJarStepConfig jarConfig = new HadoopJarStepConfig(S3N_HADOOP_JAR);
        jarConfig.setArgs(ARGS_AS_LIST);
        StepConfig stepConfig = new StepConfig(EMR_NAME, jarConfig);

        request.setSteps(Arrays.asList(new StepConfig[] {stepConfig_setting, stepConfig}));

        RunJobFlowResult result = emr.runJobFlow(request);

        // 생성한 EMR에 대한 실행 상태코드 체크
        String lastState = "";
        STATUS_LOOP: while (true) {
            DescribeJobFlowsRequest desc = new DescribeJobFlowsRequest(Arrays.asList(new String[] {result.getJobFlowId()}));
            DescribeJobFlowsResult descResult = emr.describeJobFlows(desc);
            for (JobFlowDetail detail : descResult.getJobFlows()) {
                if (isDone(detail.getExecutionStatusDetail().getState())) {
                    System.out.println(detail.getExecutionStatusDetail().getState());
                    break STATUS_LOOP;
                } else if (!lastState.equals(detail.getExecutionStatusDetail().getState())) {
                    lastState = detail.getExecutionStatusDetail().getState();
                    System.out.println(lastState);
                }
            }
          Thread.sleep(10000);
        }
    } catch (AmazonServiceException ase) {
        System.out.println("Caughtption: "      + ase.getMessage());
        System.out.println("Reponseus Code: "   + ase.getStatusCode());
        System.out.println("Error: "            + ase.getErrorCode());
        System.out.println("Request"            + ase.getRequestId());
    }
}

public static boolean isDone(String value)
{
    JobFlowExecutionState state = JobFlowExecutionState.fromValue(value);
    return DONE_STATES.contains(state);
}

끝.


참고 : http://mpouttuclarke.wordpress.com/2011/06/24/how-to-run-an-elastic-mapreduce-job-using-the-java-sdk/

저작자 표시
신고

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

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);  <--이녀석은 1000개 단위로만 가져옴..
} while (objects.isTruncated());

지정된 bucket에 S3 Object가 10,300개가 있다고 가정하면 위와 같이 코딩을 하게 되면

1000개 단위 10번 즉 10,000개의 Object만 가져올 수 있다.


전체 데이터를 다 가져오려면 아래와 같이 코딩을 해야 한다.

AWSCredentials crd = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3 s3 = new AmazonS3Client(crd);
ListObjectsRequest listObject = new ListObjectsRequest();
listObject.setBucketName(bucketName);
listObject.setPrefix(folderName);
            
ObjectListing objects = s3.listObjects(listObject);
do {
	objects = s3.listObjects(listObject);
        //1000개 단위로 읽음
	for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
      
	}
      //objects = s3.listNextBatchOfObjects(objects);  <--이녀석은 1000개 단위로만 가져옴..
      listObject.setMarker(objects.getNextMarker());
} while (objects.isTruncated());
끝.


저작자 표시
신고

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
secret

R Oracle Connection

R 2014.02.24 13:13

지난번 R DB Connection 글에서 R에서 RDBMS에 Connection하는 방법을 알아보았다.

지난 글에서는 MySQL를 접속했었는데 Oracle접속하는 방법도 간단하다.


ojdbc.jar파일을 다운로드 받은 후 특정폴더에 복사한다.

여기서는 지난 MySQL과 마찬가지로 /usr/share/java 폴더로 복사였다.


Oracle connection 소스는 아래와 같다. 자세한 사항은 지난 R DB Connection을 참고하기 바란다.

library(DBI)
library(RJDBC)
library(rJava)
drv<-JDBC("oracle.jdbc.driver.OracleDriver", "/usr/share/java/ojdbc14.jar")
conn<-dbConnect(drv, "jdbc:oracle:thin:@//<db_ip>:<port>/<sid>","<id>","<pw>")
query = "SELECT * FROM TABLES"
dbGetQuery(conn, query)

실제 소스 실행화면


저작자 표시
신고

'R' 카테고리의 다른 글

R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21
R boxplot을 이용한 출근시간 분석 및 시각화  (0) 2014.02.19

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  4개가 달렸습니다.
  1. 안녕하세요 컴퓨터공학과 4학년입니다. 현재 R과 하둡을 이용하여 빅데이터를 분석후 워드클라우드 같은 것을 웹에 JSP를 이용하여 뿌려 주려하는데요
    혹시 확장자 .R 소스(라이브러리 등등)을 .java에서 가져오게 하려면 어떻게 해야하나요? JRI 이용한 지금까지의 소스를 볼수 있을지 해서 올려봅니다. 즐거운 하루 되세요!
    • R과 Java간의 인터페이스는 Java Runtime Interface를 이용하여 가능합니다.
      http://using.tistory.com/55 여기를 참고해주세요
  2. 안녕하세요 질문이 있어서 연락드립니다.
    drv<-JDBC("oracle.jdbc.driver.OracleDriver", "/usr/share/java/ojdbc14.jar")

    여기서 classPath 잡는 부분이 잘 안되서요.
    ojdbc14.jar를 기존 client 설치되어 있는 곳으로 연결하려고 하거든요.
    classpath를 정확히 어떻게 잡아줘야 class가 로드될지 알고 싶습니다.

    windows7 이고요.. 로컬 환경변수 설정해서 연결해도 잘 안되네요..

    그럼, 수고하세요
    • 우선 작성해주신 내용만으로는 파악이 어렵네요 ^^;

      단순 클래스패스 설정 문제라면 검색하면 많이 나옵니다.
secret