10

私のデータ処理の一般的なパターンは、いくつかの列のセットでグループ化し、フィルターを適用してから、再びフラット化することです。例えば:

my_data_grouped = group my_data by some_column;
my_data_grouped = filter my_data_grouped by <some expression>;
my_data = foreach my_data_grouped flatten(my_data);

ここでの問題は、my_dataこの操作の後に (c1、c2、c3) のようなスキーマで開始すると、(mydata::c1、mydata::c2、mydata::c3) のようなスキーマになることです。列が一意の場合、「mydata::」プレフィックスを簡単に取り除く方法はありますか?

私はこのようなことができることを知っています:

my_data = foreach my_data generate c1 as c1, c2 as c2, c3 as c3;

ただし、多数の列を含むデータ セットの場合、これは厄介で維持が難しくなり、可変列を含むデータ セットの場合は不可能です。

4

2 に答える 2

4

スキーマ内のすべてのフィールドに同じプレフィックスのセット (例: group1::id、group1::amount など) がある場合、特定のフィールドを参照するときにプレフィックスを無視できます (それらを id、amount などとして参照するだけです)。

または、単一レベルのプレフィックスのスキーマを削除したい場合は、次のような UDF を使用できます。

public class RemoveGroupFromTupleSchema extends EvalFunc<Tuple> {

@Override
public Tuple exec(Tuple input) throws IOException {
    Tuple result = input;
    return result;
}


@Override
public Schema outputSchema(Schema input) throws FrontendException {
    if(input.size() != 1) {
        throw new RuntimeException("Expected input (tuple) but input does not have 1 field");
    }

    List<Schema.FieldSchema> inputSchema = input.getFields();
    List<Schema.FieldSchema> outputSchema = new ArrayList<Schema.FieldSchema>(inputSchema);
    for(int i = 0; i < inputSchema.size(); i++) {
        Schema.FieldSchema thisInputFieldSchema = inputSchema.get(i);
        String inputFieldName = thisInputFieldSchema.alias;
        Byte dataType = thisInputFieldSchema.type;

        String outputFieldName;
        int findLoc = inputFieldName.indexOf("::");
        if(findLoc == -1) {
            outputFieldName = inputFieldName;
        }
        else {
            outputFieldName = inputFieldName.substring(findLoc+2);
        }
        Schema.FieldSchema thisOutputFieldSchema = new Schema.FieldSchema(outputFieldName, dataType);
        outputSchema.set(i, thisOutputFieldSchema);
    }

    return new Schema(outputSchema);
}
}
于 2012-11-26T20:11:57.340 に答える
1

「AS」ステートメントを「foreach」と同じ行に置くことができます。

すなわち

my_data_grouped = group my_data by some_column;
my_data_grouped = filter my_data_grouped by <some expression>;
my_data = FOREACH my_data_grouped FLATTEN(my_data) AS (c1, c2, c3);

ただし、これは 2 行で実行するのとまったく同じであり、「可変列を含むデータ セット」の問題は緩和されません。

于 2012-06-19T15:31:14.440 に答える