Apache pig 如何为关系指定顺序递增的数字

Apache pig 如何为关系指定顺序递增的数字,apache-pig,Apache Pig,我想知道是否有一种方法可以在一个关系中创建一个新字段,然后给它分配一个按顺序递增的数字?以下是一个例子: ordered_products = ORDER products BY price ASC; ordered_products_with_sequential_id = FOREACH ordered_products GENERATE price, some_sequential_id; 如何创建一些\u顺序\u id?不过,我不确定这在Pig中是否可行。我怀疑您必须编写自己的UDF才

我想知道是否有一种方法可以在一个关系中创建一个新字段,然后给它分配一个按顺序递增的数字?以下是一个例子:

ordered_products = ORDER products BY price ASC;
ordered_products_with_sequential_id = FOREACH ordered_products GENERATE price, some_sequential_id;

如何创建一些\u顺序\u id?不过,我不确定这在Pig中是否可行。

我怀疑您必须编写自己的UDF才能运行它。一种方法是在
exec
实现中增加UDF中的静态变量(
AtomicInteger

public class IncrEval extends EvalFunc<Long> {

    final static AtomicLong res = new AtomicLong(0);

    @Override
    public Long exec (Tuple tip) throws IOException {
        if (tip == null || tip.size() == 0) {
            return null;
        }

        res.incrementAndGet();
        return res.longValue();
    }
}
公共类递增扩展EvalFunc{
最终静态原子长res=新原子长(0);
@凌驾
public Long exec(元组提示)引发IOException{
if(tip==null | | tip.size()==0){
返回null;
}
res.incrementAndGet();
返回res.longValue();
}
}
清管器脚本条目:

b=FOREACH a GENERATE,com.eval.incremal()作为ID:long

这很有趣。但这会给整个关系分配一个序列号吗?我觉得这个数字只能在一个映射器中按顺序排列?是的,这是缺点。您必须将parallelism设置为1。