데이터 유형 오류로 인해 값의 모음을 합산하는 데 문제가 있습니다.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 서비스에 대화 형 모드에서 이것을 실행하고 있습니다.
감사합니다. Romain, 완벽하게 작동했습니다. 스키마를 적용하면 돼지가 암시 적 캐스트에 대해 지시한다는 인상을 받았습니다. http://aws.amazon.com/articles/2729의 튜토리얼에서로드 된 데이터에 명시 적 캐스트없이 사용 된 SUM 함수가 집계 된 이유가 궁금합니다 ... 다시 한 번 감사드립니다. – mindonaut