>

이와 같은 데이터가 있습니다.

1:23:0.20
 2:34:0.50
 3:67:0.90
 4:87:0.10
 5:23:0.12

2 행마다 마지막 열 값을 합산하려고합니다.

0.20+0.50 = 0.70
0.90+0.10 = 1.0

이와 같이 인쇄

1:23:0.20:0.70
 2:34:0.50:0.70
 3:67:0.90:1.0
 4:87:0.10:1.0
 5:23:0.12

이것은 내 돼지 스크립트입니다

data = LOAD '/home/user/Documents/test/test.txt' using PigStorage(':') AS (tag:int,rssi:chararray,weightage:chararray,seqnum:int);
B = FOREACH (GROUP data ALL) {
A_ordered = ORDER data BY rssi;
GENERATE FLATTEN(CUSTOM_UDF(A_ordered));
}

Java UDF로 시도했습니다. 제대로 작동하지 않습니다.

this is what I tried.
public List<String> sumValues() {
    List<String> processedList = new ArrayList<>();
    if (entries == null) {
        return processedList;
    } else {
        double columnSum = 0;
        List<String> tempList = new ArrayList<>(); 
        int length = entries.size();
        for (int index = 1; index <= length; index++) {
            tempList.add(entries.get(index - 1)); 
            String[] splitValues = entries.get(index - 1).split(DELIMITER);
            if (splitValues.length >= MIN_SPLIT_STRING_LENGTH) {
                try {
                    double lastValue = Double.parseDouble(splitValues[WEIGHTAGE_INDEX]);
                    columnSum = columnSum + lastValue;
                    if ((index % ROWS_TO_BE_SUMMED == 0) || (index == length)) {
                        for (String tempString : tempList) {
                            processedList.add(tempString + ":" + columnSum);
                        }
                        tempList.clear(); // Clear the temporary array
                        columnSum = 0;
                    }
                } catch (NumberFormatException e) {
                    System.out.println("Invalid weightage");
                }
            } else {
                System.out.println("Invalid input");
            }
        }
    }
    return processedList;
}

@Override
public String exec(Tuple input) throws IOException {
    System.out.println("------INSIDE EXEC FUCTION ----" + input);
    if (input != null && input.size() != 0) {
        try {
            String str = (String) input.get(0);
            if (str != null) {
                String splitStrings[] = str.split(":");
                if (splitStrings != null && splitStrings.length >= 3 && splitStrings[2].equals(EXIT)) {
                    List<String> processedList = sumValues();
                    String sum = processedList.toString();
                    System.out.println("SUM VALUE----:" + sum);
                    return sum;
                } else {
                    System.out.println("INPUT VALUE----:" + str);
                    entries.add(str);
                    return null;
                }
            }
        } catch (Exception e) {
            return null;
        }
    }
    return null;
}
}

위 코드는 빈 결과를 인쇄합니다. 도움을 주시면 감사하겠습니다.

  • 답변 # 1

    이것은 PIG 자체에서 수행 할 수 있습니다. 데이터 세트의 짝수 행을 기준으로 f11이라고하는 다른 열을 생성하고 1에서 빼서 동일한 ID를 가진 2 행 세트를 만듭니다. 이러한 두 레코드를 새 레코드로 그룹화 할 수 있습니다 마지막 열을 합산 한 다음 관계와 새 세트를 결합하고 원하는 열을 가져옵니다.

    참고 : n 개의 행 합계에는 f1 % n_value를 사용하십시오.

    A = LOAD 'input.txt' USING PigStorage(':') AS (f1:int,f2:int,f3:double);
    B = FOREACH A GENERATE f1,(f1%2 == 0 ? (f1-1):f1) AS f11,f2,f3;
    C = GROUP B BY f11;
    D = FOREACH C GENERATE group AS f11,SUM(f3) AS Total;
    E = JOIN B BY f11,D BY f11;
    F = FOREACH E GENERATE B.f1,B.f2,B.f3,D.Total;-- Note:use B::f1,B::f2,B::f3,D::Total if '.' doesn't work.
    
    

    출력

    A

    1,23,0.20
    2,34,0.50
    3,67,0.90
    4,87,0.10
    5,23,0.12
    
    

    B-짝수 행 번호-1을 기준으로 새 두 번째 열을 추가합니다.

    1,1,23,0.20
    2,1,34,0.50
    3,3,67,0.90
    4,3,87,0.10
    5,5,23,0.12
    
    

    C-새로운 두 번째 열로 그룹화

    1,{(1,23,0.20),(2,34,0.50)}
    3,{(3,67,0.90),(4,87,0.10)}
    5,{(5,23,0.12)}
    
    

    D-그룹화 후 합계 생성

    1,0.70
    3,1.0
    5,0.12
    
    

    E-새 열을 사용하여 이전 단계의 데이터 세트와 B를 결합합니다

    1,1,23,0.20,1,0.70
    2,1,34,0.50,1,0.70
    3,3,67,0.90,3,1.0
    4,3,87,0.10,3,1.0
    5,5,23,0.12,5,0.12
    
    

    E-원하는 열을 가져옵니다.

    1,23,0.20,0.70
    2,34,0.50,0.70
    3,67,0.90,1.0
    4,87,0.10,1.0
    5,23,0.12,0.12
    
    

  • 답변 # 2

    udf에서 tuple(int, chararray, chararray, int) 를받습니다   String 로 첫 번째 요소를 얻으려고 노력하십시오. . try...catch 로 코드를 둘러싼 것처럼  당신은 ClassCastException 를 볼 수 없습니다  확실히 거기에 발생합니다. 또한 : 로 가치를 나눌 필요가 없습니다.  이미로드 했으므로 분할되었습니다.

관련 자료

  • 이전 reactjs - 반응하여 테이블을 클릭 할 수있게하고 세부 사항을 편집하십시오
  • 다음 java - DAO 클래스는 동일한 @Qualifier를 갖습니다