2012-01-12 2 views
4

데이터 유형 오류로 인해 값의 모음을 합산하는 데 문제가 있습니다.Apache Pig의 데이터 유형을 어떻게 수정할 수 있습니까?

나는 누구의 라인과 같이 CSV 파일로드 할 때 : 사용

6 574 false 10.1.72.23 2010-05-16 13:56:19 +0930 fbcdn.net static.ak.fbcdn.net 304 text/css 1 /rsrc.php/zPTJC/hash/50l7x7eg.css http pwong 

을 다음

logs_base = FOREACH raw_logs GENERATE 
    FLATTEN(
    EXTRACT(line, '^(\\d+),"(\\d+)","(\\w+)","(\\S+)","(.+?)","(\\S+)","(\\S+)","(\\d+)","(\\S+)","(\\d+)","(\\S+)","(\\S+)","(\\S+)"') 
) 
    as (
    account_id: int, 
    bytes: long, 
    cached: chararray, 
    ip: chararray, 
    time: chararray, 
    domain: chararray, 
    host: chararray, 
    status: chararray, 
    mime_type: chararray, 
    page_view: chararray, 
    path: chararray, 
    protocol: chararray, 
    username: chararray 
); 

모든 항목이 같이 잘로드, 오른쪽 유형 것 같다

grunt> describe logs_base 
logs_base: {account_id: int,bytes: long,cached: chararray,ip: chararray,time: chararray,domain: chararray,host: chararray,status: chararray,mime_type: chararray,page_view: chararray,path: chararray,protocol: chararray,username: chararray} 

내가 사용하여 SUM을 수행 할 때마다 :

은 "설명"명령에 의해

org.apache.pig.backend.executionengine.ExecException: ERROR 2106: Error while computing sum in Initial 
    at org.apache.pig.builtin.LongSum$Initial.exec(LongSum.java:87) 
    at org.apache.pig.builtin.LongSum$Initial.exec(LongSum.java:65) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POUserFunc.getNext(POUserFunc.java:216) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POUserFunc.getNext(POUserFunc.java:253) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext(PhysicalOperator.java:334) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.processPlan(POForEach.java:332) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.getNext(POForEach.java:284) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.processInput(PhysicalOperator.java:290) 
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POLocalRearrange.getNext(POLocalRearrange.java:256) 
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBase.runPipeline(PigGenericMapBase.java:267) 
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBase.map(PigGenericMapBase.java:262) 
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBase.map(PigGenericMapBase.java:64) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:771) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:375) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212) 
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long 
    at org.apache.pig.builtin.LongSum$Initial.exec(LongSum.java:79) 
    ... 15 more 

라인 내 관심을 잡는다 : 믿고 날 리드

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long 

617,451,515,

bytesCount = FOREACH (GROUP logs_base ALL) GENERATE SUM(logs_base.bytes); 

저장하거나 내용을 덤프는 맵리 듀스 프로세스는 다음 오류와 함께 실패 추출 함수가 바이트 필드를 필수 데이터 유형 (long)으로 변환하지 않는다는 것을 나타냅니다.

올바른 데이터 형식으로 변환하기 위해 추출 기능을 적용 할 수있는 방법이 있습니까? 모든 레코드에 대해 FOREACH를 수행 할 필요없이 어떻게 값을 캐스팅 할 수 있습니까? (시간을 유닉스 타임 스탬프로 변환하고 MIN을 찾으려고 할 때도 똑같은 문제가 발생합니다. 불필요한 예측이 필요없는 솔루션을 찾고 싶습니다.)

모든 포인터가 제공됩니다. 도와 주셔서 정말로 고맙습니다.

감사합니다, 호르헤 C.

P.S. 나는 아마존 탄성 mapreduce 서비스에 대화 형 모드에서 이것을 실행하고 있습니다.

답변

8

cast의 데이터를 UDF에서 검색 했습니까? 여기에 스키마를 적용해도 캐스팅은 수행되지 않습니다.

logs_base = 
    FOREACH raw_logs 
    GENERATE 
     FLATTEN(
      (tuple(LONG,LONG,CHARARRAY,....)) EXTRACT(line, '^...') 
     ) 
     AS (account_id: INT, ...); 
+0

감사합니다. Romain, 완벽하게 작동했습니다. 스키마를 적용하면 돼지가 암시 적 캐스트에 대해 지시한다는 인상을 받았습니다. http://aws.amazon.com/articles/2729의 튜토리얼에서로드 된 데이터에 명시 적 캐스트없이 사용 된 SUM 함수가 집계 된 이유가 궁금합니다 ... 다시 한 번 감사드립니다. – mindonaut