gpt4 book ai didi

apache-pig - Apache Pig:组操作后删除 namespace 前缀(::)

转载 作者:行者123 更新时间:2023-12-04 04:22:31 26 4
gpt4 key购买 nike

我的数据处理中常见的模式是按一组列进行分组,应用过滤器,然后再次展平。例如:

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;

但是,对于具有许多列的数据集,这变得笨拙且难以维护,而对于具有可变列的数据集,这是不可能的。

最佳答案

如果架构中的所有字段都具有相同的前缀集(例如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);
}
}

关于apache-pig - Apache Pig:组操作后删除 namespace 前缀(::),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com