홈>
이와 같은 데이터가 있습니다.
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
- 답변 # 2
udf에서
tuple(int, chararray, chararray, int)
를받습니다String
로 첫 번째 요소를 얻으려고 노력하십시오. .try...catch
로 코드를 둘러싼 것처럼 당신은ClassCastException
를 볼 수 없습니다 확실히 거기에 발생합니다. 또한:
로 가치를 나눌 필요가 없습니다. 이미로드 했으므로 분할되었습니다.
관련 자료
- javascript - 두 값 사이의 숫자를 늘리고 범위 제한도 처리합니다
- python - 목록의 처음 2 개 값과 마지막 2 개 값을 다른 숫자로 곱하기
- dataframe - 그룹 별 고유 값 수 계산
- java - 배열 "arr"에있는 고유 한 숫자 값의 수를 반환합니다
- java : 배열의 모든 숫자의 마지막 숫자를 반환합니다.
- python - 직원이 선택한 특정 날짜에 모든 고객이 주문한 수를 어떻게 볼 수 있습니까?
- conditional statements - excel (평균, 표준 편차,…) - n 번째 열마다 값 포함
- JavaScript에서 알 수없는 수의 배열 값을 필터링하는 방법은 무엇입니까?
- dataframe - 열 그룹 내에서 서로 다른 값의 수를 계산합니다
- JavaScript 증분 번호 (if 문)가 참일 때마다
- C ++에서 다른 값으로 동일한 ID 번호를 어떻게 저장할 수 있습니까?
- python - 정렬 된 데이터 프레임의 ID 당 열에서 서로 다른 값의 수/고유
- sql server - SQL에서 각 필드의 값 수를 개별적으로 계산
- r - 다른 테이블에서 간격이 겹치는 모든 행에 대해 한 테이블의 열에서 값 목록 인쇄
- 주어진 두 값이 R의 한 행에서 함께 발생하는 횟수를 어떻게 계산합니까?
- rstudio - R의 결 측값 개수 계산
- python - 열에서 숫자가 아닌 값을 "NaN"으로 채 웁니다
- javascript - js 형식으로 숫자 등급 값을 얻는 방법
- MongoDb에서 필드의 고유 값 수를 계산하는 하위 쿼리
- bash - 명령 출력에서 모든 숫자가 x보다 높지만 y보다 작은 지 어떻게 확인합니까?
이것은 PIG 자체에서 수행 할 수 있습니다. 데이터 세트의 짝수 행을 기준으로 f11이라고하는 다른 열을 생성하고 1에서 빼서 동일한 ID를 가진 2 행 세트를 만듭니다. 이러한 두 레코드를 새 레코드로 그룹화 할 수 있습니다 마지막 열을 합산 한 다음 관계와 새 세트를 결합하고 원하는 열을 가져옵니다.
참고 : n 개의 행 합계에는 f1 % n_value를 사용하십시오.
출력
A
B-짝수 행 번호-1을 기준으로 새 두 번째 열을 추가합니다.
C-새로운 두 번째 열로 그룹화
D-그룹화 후 합계 생성
E-새 열을 사용하여 이전 단계의 데이터 세트와 B를 결합합니다
E-원하는 열을 가져옵니다.