레이블이 Mining인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Mining인 게시물을 표시합니다. 모든 게시물 표시

2012년 9월 1일 토요일

데이터 분석 과정에서의 적절한 동료.


가장 중요한 것.


분석 과정에서의 가정과 방법의 정당함.

과정에 헛점이 있으면 결과는 아무 쓸모가 없다. 


과정에 대한 철저한 검증없이 나온 데이터로 의사결정을 하는 건 

'동전 던지기'를 하는것과 하나도 다르지 않다. 


전체 프로세스에 대해서,

일말의 의문도 없을 정도로 공격하는 동료가 필요하다. 


받아들이고, 까고, 

까고, 받아들이고, 

술마시고 히히덕 거리는 그런 관계.



2012년 7월 24일 화요일

Data Mining Scrap #1

















#1 



<slide>




# Devs Love Bacon: Everything you need to know about Machine Learning in 30 minutes or less


http://www.hilarymason.com/presentations-2/devs-love-bacon-everything-you-need-to-know-about-machine-learning-in-30-minutes-or-less/




# twitter에서는 pig를 가지고 ML을.. 


https://speakerdeck.com/u/lintool/p/large-scale-machine-learning-at-twitter






<paper>




# Trustworthy Online Controlled Experiments: Five Puzzling Outcomes Explained


http://blog.markus-breitenbach.com/2012/07/06/puzzling-outcomes-in-controlled-experiments/


http://glinden.blogspot.kr/2012/07/puzzling-outcomes-in-ab-testing.html




controlled experiments (=A/B test)의 결과가 이상하게 나왔을때의 이유와 어떻게 해야될지에 대한 경험.. 




  1. the OEC for a Search Engine


    - OEC (overall evaluation criterion)을 무엇으로 하는가가 중요하다. 


    - 잘못된 검색엔진의 결과 => 쿼리수 상승, 수입증가(광고클릭 증가) 


    - ??? => 원하는 검색결과가 나오지 않아서 클릭을 많이 했다. => 장기적으로 유저감소 


    - distict queries/month = users/month * sessions/user * distinct queries/session 로 decompose..


    - distinct queries/session 는 검색엔진의 성능이 떨어져도 상승


    - sessions/user 를 봐야 실제로 성능이 좋아졌는지 판단 가능하다. 




  2. Click Tracking


    - 속도 감소 => 유저클릭 증가?? 




  3. Initial Effects Appear to Trend


    - primacy : 기존 유저가 바뀐데 적응을 못해 수치가 적게 나옴 


    - novelity : 기존 유저가 새로운 기능을 모두 눌러봐서 (궁금해서) 수치가 높게 나옴


    => new user만 측정?


    => 초기 7일 제거?


    => 분석 기간의 연장? 




  4. Experiment Length and Statistical Power


    - 분석기간을 늘린다고 CV(coefficient variable)이 낮아지지 않는 경우도 있다. 


    => 적당한 분석기간 필요 




  5. Carryover Effects


    - bucket test를 했던 유저의 경우에 test가 끝나도 일반유저와 동일한 수치가 되려면 시간이 필요하다. 


    => A/A test 필요 


    => bucket 테스트 마다 user를 indepent 하게 선택






<term>




# controlled experiments = A/B test = bucket test (거의 유사, 미묘한 차이..)




# 구글 판다 & 팽귄 


http://googlekoreablog.blogspot.kr/2012/07/blog-post.html


- 구글 코리아에서 구글 판다 알고리즘이 한국에도 적용되었다고 함. 


- 구글 판다는 사이트 품질의 높고 낮음을 평가하는 ML기반 알고리즘.


- 구글 팽귄은 주로 SEO를 악용한 사이트의 랭킹을 낮추는 알고리즘.




# 구글 판다


http://en.wikipedia.org/wiki/Google_Panda


aimed to lower the rank of "low-quality sites" or "thin sites", and return higher-quality sites near the top of the search results.


- scraper sites


- thin content sites


- similar content sites


- badly structuerd sites




# 구글 팽귄


http://en.wikipedia.org/wiki/Google_Penguin


The update is aimed at decreasing search engine rankings of websites that violate Google’s Webmaster Guidelines by using black-hat SEO techniques such as keyword stuffing,cloaking, participating in link schemes, deliberate creation of duplicate content, and others.




# keyword stuffing


 - Coloring text the same as the background color


 - Positioning text far away from the center of the webpage


 - Putting text behind a picture so that it cannot be seen






<etc>




# sed one line


http://sed.sourceforge.net/sed1line.txt




# awk one line


http://www.pement.org/awk/awk1line.txt









2012년 5월 1일 화요일

직관, 통찰, 지식, 과학. 끄적끄적..






# 직관


Intuition : 직관(력), 직관적 통찰(력), 직각(直覺)........ 〈철학〉 직관, 직각; 직관에 의해 얻은 진리, 직관적 지식...


판단·추론 등의 매개 없이 대상을 직접 인식하는 작용, 또는 그 결과로 얻은 내용. 직관은 그것을 어떻게 포착하느냐에 따라 여러 가지 의미를 가진다. 

[#M_더보기|접기|

① 인식의 소재를 주는 감성적 직관은 개별적인 것에 직접 관계하며 사고가 그것을 사유하므로, 보편적인 것에 대한 인식이 생긴다. I. 칸트의 철학에서 대상의 인식조건으로서 직관과 개념을 말하는 것은 이런 의미다.

② 인식의 최고단계로서의 직관은 플라톤에서의 이데아의 직관, B. 스피노자에서의 직관지(直觀知)로 모든 감성적 경험, 오성적(悟性的) 사고를 넘어선 실재(實在)를 포착하는 직관이다. 

③ 인식의 기초에 관계된 직관은 어떤 추론(推論)에도 매개되지 않고 추론의 기초를 이루는 원리를 포착하는 직관이며, 예를 들어 R. 데카르트의 명증지(明證知)는 이런 의미에서의 직관이다. 또 M. 셸러의 실질적 가치윤리학은 감정에 의해서 <아프리오리(선험적)>한 실질적 가치를 직관하는 감정적 직관주의이다. 

④ 대상과의 합일로서의 직관은 어떤 매개도 필요없는 직관의 성격으로, 보는 것과 보여지는 것의 대립을 지양하고 양자의 합일에 이른다. H.L. 베르그송은 대상과 합일되는 직관에 의해서만 세계의 내적 본질인 생명의 약동이 포착된다고 하였고, 신비주의에서는 신비적 직관은 절대자와의 합일을 가능하게 한다고 하였다. .............. (Yahoo 백과사전 : 직관)

전문성 (expertise) 은 경험에 기초한 패턴식별과 연관 (pattern discrimination and association) 이다. 그것은 직관적 (intuitive) 이다. 그것을 몇개의 규칙과 이론으로 환원할수 있다는 증거는 없다. 따라서 AI 는 규칙들과 원리들을 (rules and principles) 사용하여 만들어지지는 않을 것이다. 지능 (intelligence) 이라는 것이 그렇게 만들어지지는 않는다. .......... (Stuart Dreyfus)

_M#]






# 통찰

Insight : 통찰력, 식견 ..


새로운 시점에서 전체구조를 파악하는 일. 문제해결이나 학습의 한 원리이며, 시행착오와 대비되는 말이다. 

[#M_더보기|접기|

독일 게슈탈트심리학자 W. 쾰러는 굶긴 침팬지를 대상으로 실험을 하였는데, 침팬지 우리 바깥쪽에 바나나를 놓아두고 침팬지에게 하나는 짧고 하나는 긴, 연결이 가능한 막대기 2개를 주었다. 잠시 후 침팬지는 막대기를 길게 연결하여 바나나를 끌어당기는 데 성공하였다. 이와 같이 통찰은 도구의 발견·사용·제작과정에서 자주 볼 수 있으며, 경험의 재구성 및 구조전환 등이 핵심이 된다. 또한 통찰은 몇 분간 주저한 뒤 갑자기 일어나며 그 결과는 잊혀지지 않는다. 임상심리학에서는 심리요법을 하는 동안 환자가 지금까지 억압에 의하여 의식할 수 없었던 갈등을 알게 되는 것을 통찰이라 하는데, 지적으로 이해되는 것이 아니라 자아가 강화되는 것을 말한다. .............. (Yahoo 백과사전 : 통찰)

BC 300년경의 고대 그리스의 물리학자 Archimedes에게는 한 가지 풀어야 할 문제가 있었다. 당시 왕이었던 Hiero가 새로 만든 왕관이 순금으로 만들어 졌는지 아니면 다른 금속이 섞여 있는지를 물어왔던 것이다. 덩어리로 있을 때에는 단순한 문제이지만 모양이 복잡한 왕관에서는 이 문제가 그리 간단치가 않았다. Archimedes는 목욕탕에서 물이 가득 찬 욕조에 앉자 넘쳐나는 물을 보고 이 문제를 해결할 방안을 찾아냈다. 그는 "유레카!"를 외치면서 알몸으로 거리를 내달렸다.

그가 찾아낸 방법은 물을 가득 채운 그릇에 왕관을 넣고 그 왕관에 의해 넘쳐나는 물의 양을 측정한 후에 왕관과 같은 무게의 순금 덩어리를 물에 담그고 나서 넘쳐나는 물의 양과 비교해 보는 것이었다. Archimedes는 이를 통해 그 왕관이 순금으로 만들어지지 않았다는 사실을 밝혀냈다. 이러한 발견을 하기 위해서 그는 통찰 (insight) 에 의존했던 것이다. 통찰은 외현적인 시행착오가 아니라 정보의 정신적 조작을 통해 문제의 해결에 접근하는 것을 말한다.

통찰은 "아하!" 경험이라는 말로도 특징지워진다. 즉, 문제에 대한 해결책이 갑작스럽게 머리 속에 떠오른다는 것이다. 아무런 관련 정보 없이 문제의 해결책이 갑작스럽게 머리 속에 떠오르는 것은 아니다. Archimedes는 무게가 동일한 금속들의 부피(즉, 밀도)가 각기 다르다는 사실을 이미 알고 있었다. 금은 그 밀도가 다른 어떤 금속보다 높으며, 밀도가 낮은 은이나 동으로 떼어낸 금만큼의 무게를 대신하려면 그 부피가 증가되어야 한다. 따라서 모양이 복잡한 왕관이 순금으로 만들어졌다면 물에 넣었을 때 넘치는 물의 양은 동일한 무게의 금덩이에 의해 넘치는 물의 양과 동일해야 한다. Archimedes는 바로 이것을 발견한 것이다. 통찰을 위해서는 문제와 관련된 기본적인 지식(개념)들이 활용 가능한 상태로 준비되어 있어야 하며 이미 어느 정도의 시행착오를 겪어야만 가능한 경우도 있다. ............... (오세진 1999)

_M#]




# 지식



직관과 통찰은 지식에서 나온다. 

코페르니쿠스가 지구가 둥글다는 통찰은 그냥 온게 아니다. 


아르키메데스가 왕관이 순금으로 이루어 졌다는것도 그냥 온게 아니다. 




A -> B -> C -> D 로 발전이 되고 있을때..



B까지만 알던 사람은 통찰력을 발휘해서 C를 발견할수 있겠지만,


그의 통찰력은 다른 사람에게는 이미 알려진 사실에 불과하다



D -> E의 통찰을 발휘하기 위해서는 D까지의 지식을 알고 있는게 필요하다. 


#


직관이라하면 
이미 알고 있거나 익숙한것에 대한 패턴의 발견인데, 이미 알고 있는것을 넓히게 되면 우리는 더 많은 직관을 알수가 있다. 


<
동적평형 中>





흔이 이야기하는 인사이트에 관한 책.


다른 사람이 얻은 인사이트가 무엇인지는 알수 있지만,


이런책을 읽는다고 인사이트가 생길지는 의문




# 과학

과학도 일종의 선택이다. 과학자가 무엇을 관찰하겠다라고 선택을 하고, 그것에 대해서 관찰한결과가 과학적 이론이 된다. 어떠한 부분을 선택을 하는가는 개인적인 취향이나 다른 사람의 관찰한 결과를 보고나서 결정을 하거나 직관에 의해서 결정된다. 이렇게 하나에 대해서 여러사람이 관찰을 하게 되면 (이를테면, 빛에 대해서..) 어느 순간 서로의 이론이 맞지 않는 모순된 순간이 오게 된다. 이 순간 그 것 (이른테면, 빛...) 에 대한 새로운 이론이 탄생한다.  이게 과학 혁명적 구조.. 











# 결론.


공부하라.


새로운 것을 배우라.


생각하라.







2012년 2월 22일 수요일

Pig UDFs


lzo 파일을 pig에서 사용해야 해서 UDF를 만들어 봤다. 
 -  hadoop에 lzo 설정하기 
 


이전까지 많은 작업들이 약간은(?) 복잡한 알고리즘이 필요한 작업들이라서 java 로 직접 데이터를 만졌었는데, 반복적인 작업들이 필요하게 되면서 pig로 작업을 하는게 편할것 같았다. 





필요한 udf 또한 복잡하지 않고 너무도 간단한 수준이라서 udf에 대해서 자세한 내용은 모르지만 필요한 함수를 만들어 보았다. (elephant-bird 라고 트위터에서 오픈해 놓은 코드가 있는데, 사내에서 사용하기가 어려운 상황..)
 


jython을 이용한 udf는 만들기가 간단해서 활용도가 높을것 같다. 



# Java UDFs - LzoPigStorage  


package xxxxx;


 


import org.apache.hadoop.io.LongWritable;


import org.apache.hadoop.io.Text;


import org.apache.hadoop.mapreduce.InputFormat;


import org.apache.hadoop.mapreduce.OutputFormat;


import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;


import org.apache.pig.builtin.PigStorage;


import com.hadoop.mapreduce.LzoTextInputFormat;


 


public class LzoPigStorage extends PigStorage {


private String delimiter = null;


 


public LzoPigStorage() {


super();


}


 


public LzoPigStorage(String delimiter) {


super(delimiter);


this.delimiter = delimiter;


}


 


@Override


public InputFormat<LongWritable, Text> getInputFormat() {


return new LzoTextInputFormat();


}


@Override


        public OutputFormat getOutputFormat() {


            return new TextOutputFormat();


        }


}


 


// 사용


register 파일명.jar;


A = load 'data_path' using xxx.LzoPigStorage('\t') AS (.....);





 





# jython 









// string_pig_udf.py





@outputSchema("rquery:chararray")



def rmQuerySpace(instr):



    return instr.replace(' ','')








// 사용


register 'string_pig_udf.py' using jython as myfuncs;


...


C = FOREACH B GENERATE myfuncs.reQuerySpace(query);


 












# 간단히 wiki로도 정리  





2012년 1월 14일 토요일

Hadoop DistributedCache

http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/filecache/DistributedCache.html

 http://yaseminavcular.blogspot.com/2010/11/using-distributed-cache-in-hadoop.html

http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=hadoop+DistributedCache#q=hadoop+DistributedCache&hl=ko&tbo=1&output=search&source=lnt&tbs=qdr:y&sa=X&ei=KEkATqb-IYeivgO1o5iFDg&ved=0CAwQpwUoBQ&fp=1&biw=1547&bih=1039&bav=on.2,or.r_gc.r_pw.&cad=b 

2011년 7월 19일 화요일

Hadoop Lzo 압축 설정 (2)


이전에 Hadoop Lzo 압축 설정에 관한 블로깅을 했는데...

그 이후에 발생했던 문제와,
실질적으로 사용하는 방법에 대해서 정리..


# 두 가지 버전의 hadoop lzo
1. https://github.com/omalley/hadoop-gpl-compression
  - 이전에 설치했던 버전

2. https://github.com/kevinweil/hadoop-lzo
  - 이 버전으로 다시 설치


# 사용법

1. 파일시스템의 파일을 압축해서 hdfs에 올리는 방법.
> lzop 파일이름
> hadoop fs -copyFromLocal 파일이름.lzo hdfs위치



2. hdfs의 lzo 파일에 index 만들기
 - lzo 파일이 있는곳에 파일이름.index라는 파일이 생긴다.
 - index를 안해주면, lzo 파일을 split하지 않고 하나의 map으로 처리

1) index it in-process via:
hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.LzoIndexer big_file.lzo

2) index it in a map-reduce job via:
hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.DistributedLzoIndexer big_file.lzo




3. splitted lzo 파일 사용
  - 파일이름.index 를 보고 알아서 나누어서 작업한다.
1) java
job 설정에 다음을 추가..

job.setInputFormatClass(LzoTextInputFormat.class);
 
2) streaming (테스트 안해봄)
실행할때 다음을 추가

"-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat




4. 최종 결과 파일을 fs로
1) lzo_deflate
  - 압축코덱을 LzoCodec으로 하면 .lzo_deflate의 형태로 압축된다.
  - lzo_deflate는 파일시스템으로 getmerge 한 후 압축을 어떻게 푸는지 알수가 없어서, 코덱 설정을 바꿈.


<property>
      <name>mapred.output.compression.codec</name>
      <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>


2) LzoCodec -> LzopCodec
   - The LzoCodec for the pure LZO
format, which uses the .lzo_deflate filename extension (by analogy with
DEFLATE, which is gzip without the headers).
  - The LzopCodec is compatible with the lzop tool, which is essentially the LZO format with extra headers.
 - map 과 reduce 사이에는 header가 없는 LzoCodec으로..
 - 최종 output은 LzopCodec 으로 변경


<property>
      <name>mapred.output.compression.codec</name>
     <value>com.hadoop.compression.lzo.LzopCodec</value>
</property>



3) getmerge 후에 fs에서 압출 풀때
  - 1개의 reducer의 경우 'lzop -d' 로 일반적인 경우처럼
  - reducer의 개수 1개 이상일 때는 다음과 같이
lzop -d 파일명.lzo -o 압축풀파일명


2011년 7월 6일 수요일

Hadoop LZO 압축 설정


# 첨가. 

hadoop-gpl-compression 를 

https://github.com/kevinweil/hadoop-lzo 로 변경해서 설치할것. 

참고 : http://upepo.tistory.com/174

-------------------------



1. lzo 설치


# 다운로드
http://www.oberhumer.com/opensource/lzo/

# 설치
./configure --enable-shared
make
make instll

# 기타
LD_LIBRARY_PATH 설정
or
/sbin/ldconfig



2. native connector library 설치

# 다운로드
http://code.google.com/a/apache-extras.org/p/hadoop-gpl-compression/

# hadoop library 복사
hadoop.0.20.0-core.jar 를 hadoop-gpl-compression/lib/ 으로 복사

# build
cnt compile-native
ant jar



3. 설정..

# 64bit 인 경우
다음 파일들을..
hadoop-gpl-compression/build/native/Linux-amd64-64/libgplcompression.la
hadoop-gpl-compression/build/native/Linux-amd64-64/lib/*

여기로 복사
hadoop/lib/native/Linux-amd64-64/

다음 파일을
hadoop-gpl-compression/build/hadoop-gpl-compression-0.1.0-dev.jar

여기로 복사
hadoop/lib


# 32bit 인 경우
Linux-amd64-64 --> Linux-i386-32 로 해서 위와 같게..



4. .bash_profile 에 추가

JAVA_LIBRARY_PATH=$JAVA_LIBRRAY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/
JAVA_LIBRARY_PATH=$JAVA_LIBRRAY_PATH:$HADOOP_HOME/lib/

export JAVA_LIBRARY_PATH




5. lzop 설치

http://www.lzop.org/
필요하면 설치..




6. hadoop conf

# core-site.xml
- lzo compression도 기본 코덱으로 설정
        <property>
              <name>io.compression.codecs</name>
        <value>org.apache.hadoop.io.compress.GzipCodec,

org.apache.hadoop.io.compress.DefaultCodec,


org.apache.hadoop.io.compress.BZip2Codec,


com.hadoop.compression.lzo.LzoCodec</value>

        </property>

        <property>
                <name>io.compression.codec.lzo.class</name>
                <value>com.hadoop.compression.lzo.LzoCodec</value>
        </property>




# mapred-site.xml
- map이 끝나고 압축해서 reduce로 전달
        <property>
                <name>mapred.compress.map.output</name>
                <value>true</value>
        </property>
        <property>
                <name>mapred.map.output.compression.codec</name>
                <value>com.hadoop.compression.lzo.LzoCodec</value>
        </property>

- reduce 끝나고 최종 결과 압축
        <property>
                <name>mapred.output.compress</name>
                <value>true</value>
        </property>
        <property>
                <name>mapred.output.compression.codec</name>
                <value>com.hadoop.compression.lzo.LzoCodec</value>
        </property>



...

설치 중에 문제 생기는 부분이 있으면 답글 남겨 주세요~ 


2011년 6월 9일 목요일

로그 분석






  하지만 나 자신에 대해서 이야기할 때, 나는 항상 가벼운 혼란에 휩싸인다.  '나는 누구인가?'라는 명제에 따라다니는 고전적인 패러독스에 발목을 붙잡히기 때문이다.  즉, 순수한 정보량을 두고 말한다면 나 이상으로 나에 대해서 많은 이야기를 할 수 있는 사람은 이 세상 어디에도 없다.  하지만 내가 자기 자신에 대해 이야기할 때, 거기에서 설명되는 나는 필연적으로 그 설명을는 나에 의해(그 가치관이나 감각의 척도, 관찰자로서의 능력, 여러 가지 현실적 이해 관계에 의해) 취사 선택된다.  그렇다면 거기에서 설명되는 '나'의 모습에 어느 정도의 객관적 진실이 있을까? 나는 그 점이 늘 마음에 걸린다.  아니, 예전부터 일관성 있게 마음에 걸렸던 문제다. 


  하지만 세상 사람들 대부분은 그런 공포나 불안을 거의 느끼지 않는 듯하다. 사람들은 기회가 있으면 놀라울 정도로 솔직한 표현으로 자기 자신에 대해 설명하려 한다.  예를 들면 이런 식이다. 


  "나는 바보라는 말을 들을 정도로 정직하고 개방적인 사람입니다."


  "나는 쉽게 상처받기 때문에 사람들과 유대 관계를 제대로 유지하지 못하는 사람입니다."


  하지만 나는, 쉽게 상처받는 사람이 다른 사람들의 마음에 깊은 상처를 입히는 모습을 몇 번이나 보았다.  정직하고 개방적인 사람이 자기는 깨닫지 못하면서 상황에 따라 적절한 변명과 거짓말을 하는 모습을 보았다.  사람의 마음을 간파하는 능력이 뛰어난 사람이 속이 훤이 들여다보이는 교언영색(巧言令色)에 너무나 쉽게 속아넘어가는 모습을 보았다.  그렇다면 우리는 자기 자신에 대해 얼마나 알고 있는 걸일까?


  그런 점을 생각하면 생각할수록 나는 나 자신에 대한 이야기를(만약 그럴 필요가 있을 경우라 해도) 보류하고 싶어진다.  그 보다는 오히려 나라는 존재 이외의 존재에 대해서 조금이라도 더 많은 객관적 사실을 알고 싶다.  그리고 그런 개별적인 사항이나 인물이 나 자신의 내부에서 어떤 위치를 차지하느냐 하는 분포, 또는 그것들을 포함한 나 자신의 균형 감각을 통하여 나라는 인간적 존재를 가능하면 객관적으로 파악하고 싶다. 





무라카미 하루키 - 스프트니크의 연인 中 









사람들은 자신이 원하는 것을 직접적으로 말하지 않고 행동으로 조심스럽게 보여준다.  사실 그들은 자신이 원하는게 무엇인지 알지 못한다.  그들이 남긴 발자취를 살펴보면, 조심스럽게나마 그들이 어떤 사람이고 무엇을 원하는지 추론해 볼 수 있다.





 

2011년 5월 16일 월요일

Python 하둡 스트리밍 (Hadoop Streaming) #2

이전글: Python 하둡 스트리밍 (Hadoop Streamming) #1 

참조
[1] : https://github.com/jhofman/icwsm2010_tutorial/blob/master/hstream.py
[2] : http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python
[3] : http://jakehofman.com/icwsm2010 



파이썬으로 hadoop streaming을 편하게 할수 있는 파이썬 클래스 소개


# 실행


./bin/hadoop jar contrib/streaming/hadoop-0.20.2-streaming.jar \


    -file .../wordcount.py \
    -file .../hstream.py \
    -mapper '.../wordcount.py -m'  \


    -reducer '.../wordcount.py -r' \


    -input input_data  \


    -output output_data 




# wordcount.py


#!/usr/bin/env python



from hstream import HStream


import sys


import re


from collections import defaultdict



class WordCount(HStream):


        def mapper(self, record):


                for word in " ".join(record).split():


                        self.write_output((word,1))



        def reducer(self, key, records):


                total = 0


                for record in records:


                        word, count = record


                        total += int(count)


                self.write_output((word,total))



if __name__== '__main__':


        WordCount()


2011년 4월 19일 화요일

Python 제너레이터 재사용. (Reseting generator object)

참고: http://stackoverflow.com/questions/1271320/reseting-generator-object-in-python


# 문제. 

yield로 제너레이터를 만들어서 사용하고, 다시 사용할 필요가 있을때.. 
y = FunctionWithYield()
for x in y: print(x)
#here must be something to reset 'y'
for x in y: print(x)
 


# 해결책

1) itertools.tee()

참조: http://docs.python.org/library/itertools.html#itertools.tee
y, y_backup = tee(FunctionWithYield())
for x in y: print(x)
for x in y_backup: print(x)

This itertool may require significant auxiliary storage (depending on how much temporary data needs to be stored). In general, if one iterator uses most or all of the data before another iterator starts, it is faster to use list() instead of tee().





2) list()

y = list(FunctionWithYield())
for x in y: print(x)
# can iterate again:
for x in y: print(x)


상황에 맞춰서 사용..