복붙노트

[HADOOP] 돼지 라틴어 스크립트를 실행하는 동안 예외를 얻기

HADOOP

돼지 라틴어 스크립트를 실행하는 동안 예외를 얻기

난 내 자신에 돼지를 배우고 및 데이터 집합을 탐험하는 동안 나는 예외가 발생하고있다. 어떻게 스크립트 왜 잘못이다 :

movies_data = LOAD '/movies_data' using PigStorage(',') as (id:chararray,title:chararray,year:int,rating:double,duration:double);
high   = FILTER movies_data by rating > 4.0;
high_rated = FOREACH high GENERATE movies_data.title,movies_data.year,movies_data.rating,movies_data.duration;
DUMP high_rated;

지도의 끝에서 실행 나는 아래의 오류를 얻고을 줄일 수 있습니다.

2018-07-22 20:11:07,213 [main] ERROR org.apache.pig.tools.grunt.Grunt

ERROR 1066: Unable to open iterator for alias high_rated. 
Backend error : org.apache.pig.backend.executionengine.ExecException: 
ERROR 0: Scalar has more than one row in the output. 
1st : (1,The Nightmare Before Christmas,1993,3.9,4568.0), 
2nd :(2,The Mummy,1932,3.5,4388.0) 
(common cause: "JOIN" then "FOREACH ... GENERATE foo.bar" should be "foo::bar" )

해결법

  1. ==============================

    1.첫째, 우리는 당신의 문제를 해결할 수있는 방법을 살펴 보자. 당신은 별칭 이름을 사용하여 필드에 액세스 할 필요가 없습니다. 귀하의 세 번째 라인은 단순히 수 :

    첫째, 우리는 당신의 문제를 해결할 수있는 방법을 살펴 보자. 당신은 별칭 이름을 사용하여 필드에 액세스 할 필요가 없습니다. 귀하의 세 번째 라인은 단순히 수 :

    high_rated = FOREACH high GENERATE title, year, rating, duration;
    

    :)이 ERROR 제안에서 볼 수 있듯이 : 당신이 어떤 이유로 별칭 이름을 사용하고자하는 경우에는 참조 연산자 (사용해야합니다. 그런 다음 줄은 같을 것이다 :

    high_rated = FOREACH high GENERATE movies_data::title, movies_data::year, movies_data::rating, movies_data::duration;
    

    다음의 오류 메시지 뒤에 정확한 이유를 이해하려고 노력하자. 당신은 도트 연산자 (.)를 사용하여 필드에 액세스하려고 할 때, 돼지 별명은 스칼라 (별칭은 하나의 행을 가짐)이라고 가정합니다. 별명이 하나 개 이상의 행을 가지고 있기 때문에, 불평했다. 당신은 돼지에서 스칼라에 대한 자세한 내용을 여기 읽을 수 있습니다 : https://issues.apache.org/jira/browse/PIG-1434

    JIRA의 출시 메모 섹션에서, 당신이 말에주의 할 것이다, 예상되는 오류 메시지가 점점 오류가 일치 :

    If a relation contains more than single tuple, a runtime error is generated: 
    "Scalar has more than one row in the output"
    
  2. ==============================

    2.이 오류없이 작동합니다.

    이 오류없이 작동합니다.

    movies_data = LOAD '/movies_data' using PigStorage(',') as (id:chararray,title:chararray,year:int,rating:double,duration:double);
    high   = FILTER movies_data by rating > 4.0;
     high_rated = FOREACH high GENERATE title,year,rating,duration;
    DUMP high_rated;
    

    필터 명령은 모든 열 레코드 필터 조건을 만족할 수있다.

  3. from https://stackoverflow.com/questions/51466235/getting-exception-while-trying-to-execute-a-pig-latin-script by cc-by-sa and MIT license