2013-08-06 1 views
4

데이터 세트의 얼마나 많은 값이 필터 조건과 일치하는지 계산하려고하는데 필터가 항목과 일치하지 않으면 문제가 발생합니다.돼지 FILTER는 내가 가질 수없는 빈 가방을 반환합니다. COUNT

data 구조의 열이 많이있다,하지만 셋이 예를 들어, 사용의있다 : key - 세트 (고유하지 않은), value에 대한 데이터 키 - 기록 된 float 값, nominal_value은 - 공칭를 나타내는 부동 값.

우리의 유스 케이스는 현재 공칭 값보다 10 % 이상 낮은 값의 수를 찾는 것입니다.

나는 이런 식으로 뭔가를하고 있어요 :

filtered_data = FILTER data BY value <= (0.9 * nominal_value); 
filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE COUNT(filtered_data.value); 
DUMP filtered_count; 

대부분의 경우, 공칭 범위를 벗어나는 모든 값이없는, 그래서 filtered_data는 빈 (또는 널 안되는 이야기하는 방법을 잘..). 결과적으로 filtered_count도 비어 있음/null이되어 바람직하지 않습니다.

filtered_data이 비어 있거나 null 인 경우 값 0을 반환하는 명령문은 어떻게 구성 할 수 있습니까?

-- Extra parens in COUNT required to avoid syntax error 
filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE COUNT((filtered_data.value is null ? {} : filtered_data.value)); 

결과 :

Two inputs of BinCond must have compatible schemas. left hand side: #1259:bag{} right hand side: #1261:bag{#1260:tuple(cf#1038:float)} 

그리고를 : 나는 온라인으로 발견 한 몇 가지 옵션을 시도했습니다 빈/널 (null) 결과를 초래

filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE (filtered_data.value is null ? 0 : COUNT(filtered_data.value)); 

.

답변

3

지금 설정 한 방식으로 잘못된 값의 수가 0 인 모든 키에 대한 정보가 손실됩니다. 대신 모든 키를 유지하는 것이 좋습니다. 카운트는 부재로 유추하는 대신 0입니다. 그렇게하려면 표시기를 사용하고 SUM :

data2 = 
    FOREACH data 
    GENERATE 
     key, 
     ((value <= 0.9*nominal_value) ? 1 : 0) AS bad; 
bad_count = FOREACH (GROUP data2 BY key) GENERATE group, SUM(data2.bad); 
관련 문제