4

フィルター条件に一致するデータ セット内の値の数をカウントしようとしていますが、フィルターがエントリに一致しない場合に問題が発生します。

私のdata構造には多くの列がありますが、この例で使用できるのは 3 つだけです: key- セットのデータ キー (一意ではない) value- 記録された float 値nominal_value- 公称値を表す float。

現在の使用例は、公称値を 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空 (または null です。どれを見分けるかはわかりません) です。これにより、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)}

と:

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

空/nullの結果になります。

4

1 に答える 1

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);
于 2013-08-07T13:56:37.410 に答える