Apache pig ApachePig:组操作后剥离命名空间前缀(::)

Apache pig ApachePig:组操作后剥离命名空间前缀(::),apache-pig,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_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'语句与'foreach'放在同一行上

i、 e

my\u data\u group=按某个\u列对my\u数据进行分组;
my_data_grouped=筛选my_data_分组依据;
my_data=将每个my_data(my_数据)分组为扁平化(c1、c2、c3);

但是,这与在两行上执行相同,并且不会缓解“具有可变列的数据集”的问题。

如果架构中的所有字段都具有相同的前缀集(例如group1::id、group1::amount等),则在引用特定字段时可以忽略前缀(仅将其引用为id、amount等)

或者,如果您仍然希望去掉一个前缀级别的模式,则可以使用如下UDF:

my_data = foreach my_data generate c1 as c1, c2 as c2, c3 as c3;
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);
}
}
公共类RemoveGroupFromTupleSchema扩展了EvalFunc{
@凌驾
公共元组执行(元组输入)引发IOException{
元组结果=输入;
返回结果;
}
@凌驾
公共架构输出架构(架构输入)抛出FrontendException{
如果(input.size()!=1){
抛出新的RuntimeException(“预期输入(元组),但输入没有1个字段”);
}
List inputSchema=input.getFields();
List outputSchema=newarraylist(inputSchema);
对于(int i=0;i
如何使用此自定义项?提前谢谢。
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);
}
}