2012-06-11 19 views
6

私のデータ処理の一般的なパターンは、いくつかの列セットをグループ化し、フィルターを適用してから再び平坦化することです。たとえば:Apache Pig:グループ操作後の名前空間接頭辞(::)

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)は、この操作の後に、それは(マイデータ:: C1、MYDATA :: C2、MYDATAのようなスキーマを持っているということです:: c3)。列がユニークであれば、簡単に "mydata ::"接頭辞を取り除く方法はありますか?

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

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

しかし、列のたくさんのデータセットのために維持しにくいとハード取得し、変数列のデータ・セットのは不可能です。

答えて

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行でそれをやってと同じであり、かつ「変数列のデータ・セット」のあなたの問題を軽減しません。

3

スキーマ内のすべてのフィールドが同じ接頭辞のセット(group1 :: id、group1 :: amountなど)を持つ場合、特定のフィールドを参照するときに接頭辞を無視できます(id、amountなどとして参照するだけです)。代わりに)

、あなたはまだあなたがこのようにUDFを使用することができます接頭辞の単一レベルのスキーマ取り除くために探している場合:この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); 
} 
} 
+0

を?前もって感謝します。 –

関連する問題