복붙노트

[HADOOP] 별칭에있는 행 수를 세는 방법

HADOOP

별칭에있는 행 수를 세는 방법

PIG에서 별칭의 행 수를 계산하기 위해 다음과 같이했습니다.

logs = LOAD 'log'
logs_w_one = foreach logs generate 1 as one;
logs_group = group logs_w_one all;
logs_count = foreach logs_group generate SUM(logs_w_one.one);
dump logs_count;

이것은 너무 비효율적 인 것 같습니다. 더 좋은 방법이 있다면 저를 계몽하십시오!

해결법

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

    1.COUNT 개는 돼지의 일부인 설명서를 참조하십시오.

    COUNT 개는 돼지의 일부인 설명서를 참조하십시오.

    LOGS= LOAD 'log';
    LOGS_GROUP= GROUP LOGS ALL;
    LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT(LOGS);
    
  2. ==============================

    2.COUNT와 함께 가방의 첫 번째 항목은 null이 아니어야합니다. 그렇지 않으면 COUNT_STAR 함수를 사용하여 모든 행을 계산할 수 있습니다.

    COUNT와 함께 가방의 첫 번째 항목은 null이 아니어야합니다. 그렇지 않으면 COUNT_STAR 함수를 사용하여 모든 행을 계산할 수 있습니다.

  3. ==============================

    3.Arnon Rotem-Gal-Oz는 이미 이전에이 질문에 대답했지만 일부는 약간 더 간결한 버전을 좋아할 수도 있다고 생각했습니다.

    Arnon Rotem-Gal-Oz는 이미 이전에이 질문에 대답했지만 일부는 약간 더 간결한 버전을 좋아할 수도 있다고 생각했습니다.

    LOGS = LOAD 'log';
    LOG_COUNT = FOREACH (GROUP LOGS ALL) GENERATE COUNT(LOGS);
    
  4. ==============================

    4.기본 계산은 다른 답변 및 돼지 문서에 명시된대로 수행됩니다.

    기본 계산은 다른 답변 및 돼지 문서에 명시된대로 수행됩니다.

    logs = LOAD 'log';
    all_logs_in_a_bag = GROUP logs ALL;
    log_count = FOREACH all_logs_in_a_bag GENERATE COUNT(logs);
    dump log_count
    

    돼지의 내장 COUNT를 사용하는 경우에도 하나의 감속기가 사용되므로 계산이 비효율적이라는 것은 당연합니다. 그러나 나는 속도를 높이는 방법 중 하나가 우리가 세고있는 관계의 RAM 활용도를 줄이는 것이라고 오늘 계시를 가지고 있습니다.

    즉, 관계를 계산할 때 실제로 데이터 자체를 신경 쓰지 않으므로 가능한 한 적은 RAM을 사용 합니다. 카운트 스크립트의 첫 번째 반복과 함께 올바른 위치에있었습니다.

    logs = LOAD 'log'
    ones = FOREACH logs GENERATE 1 AS one:int;
    counter_group = GROUP ones ALL;
    log_count = FOREACH counter_group GENERATE COUNT(ones);
    dump log_count
    

    이것은 이전 스크립트보다 훨씬 더 큰 관계에서 작동하며 훨씬 빨라야합니다. 이 스크립트와 원본 스크립트의 가장 큰 차이점은 무엇보다 합계 할 필요가 없다는 것입니다.

  5. ==============================

    5.사용 COUNT_STAR

    사용 COUNT_STAR

    LOGS= LOAD 'log';
    LOGS_GROUP= GROUP LOGS ALL;
    LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT_STAR(LOGS);
    
  6. ==============================

    6.다음은 최적화 된 버전입니다. 위의 모든 솔루션은 돼지가 계산할 때 전체 튜플을 읽고 쓰도록 요구합니다.이 스크립트는 아래에 '1'문자를 씁니다.

    다음은 최적화 된 버전입니다. 위의 모든 솔루션은 돼지가 계산할 때 전체 튜플을 읽고 쓰도록 요구합니다.이 스크립트는 아래에 '1'문자를 씁니다.

    DEFINE row_count(inBag, name) RETURNS result {
        X = FOREACH $inBag generate 1;
        $result = FOREACH (GROUP X ALL PARALLEL 1) GENERATE '$name', COUNT(X);
    };
    

    그것을 좋아하는 사용

    xxx = row_count(rows, 'rows_count');
    
  7. ==============================

    7.당신이 원하는 것은 릴레이션의 모든 라인을 세는 것입니다 (Pig Latin의 데이터 세트)

    당신이 원하는 것은 릴레이션의 모든 라인을 세는 것입니다 (Pig Latin의 데이터 세트)

    이것은 다음 단계에 따라 매우 쉽습니다.

    logs = LOAD 'log'; --relation called logs, using PigStorage with tab as field delimiter
    logs_grouped = GROUP logs ALL;--gives a relation with one row with logs as a bag
    number = FOREACH LOGS_GROUP GENERATE COUNT_STAR(logs);--show me the number
    

    COUNT_STAR 대신 COUNT를 사용하는 것이 중요한 Kevin의 요점이라고 말해야합니다. 첫 번째 필드가 null이 아닌 행 수만 있습니다.

    또한 제롬 (Jerome)의 한 줄 구문이 더 간결하지만 교훈이되기 위해서는 두 가지로 나누고 몇 가지 덧글을 추가하는 것을 선호합니다.

    일반적으로 나는 선호한다 :

    numerito = FOREACH (GROUP CARGADOS3 ALL) GENERATE COUNT_STAR(CARGADOS3);
    

    위에

    name = GROUP CARGADOS3 ALL
    number = FOREACH name GENERATE COUNT_STAR(CARGADOS3);
    
  8. from https://stackoverflow.com/questions/9900761/pig-how-to-count-a-number-of-rows-in-alias by cc-by-sa and MIT license