0

不知何故,我得到了 filename.log,例如(制表符分隔)

Name:Peter Age:18

Name:Tom Age:25

Name:Jason Age:35

因为键列的值可能不同,所以当我加载文本时无法定义架构

a = load 'filename.log' as (Name:chararray,Age:int);

我也不想按位置调用列

b = foreach a generate $0,$1;

我想做的是,仅从那个 filename.log 开始,就可以通过键调用每个值,例如

a = load 'filename.log' using PigStorage('\t');

b = group b by Name;

c = foreach b generate group, COUNT(b);

dump c;

为此,我编写了一些Java UDF,它分离键:值并为元组中的每个字段获取值,如下所示

public class SPLITALLGETCOL2 extends EvalFunc<Tuple>{
    @Override
    public Tuple exec(Tuple input){
        TupleFactory mTupleFactory = TupleFactory.getInstance();
        ArrayList<String> mProtoTuple = new ArrayList<String>();
        Tuple output;
        String target=input.toString().substring(1, input.toString().length()-1);
        String[] tokenized=target.split(",");
        try{
            for(int i=0;i<tokenized.length;i++){
                mProtoTuple.add(tokenized[i].split(":")[1]);
            }
            output =  mTupleFactory.newTupleNoCopy(mProtoTuple);
            return output;
        }catch(Exception e){
            output =  mTupleFactory.newTupleNoCopy(mProtoTuple);
            return output;
        }
    }
}

我应该如何改变这个方法来得到我想要的?或者我应该如何编写其他 UDF 才能到达那里?

4

1 回答 1

0

无论您做什么,都不要使用元组来存储输出。元组旨在存储固定数量的字段,您可以在其中了解每个字段包含的内容。由于您不知道密钥将采用 Name,Age 形式(甚至存在,或者不会有更多),因此您应该使用bag。袋子是一组无序的元组。只要元组具有相同的模式,它们就可以包含任意数量的元组。这些都是 schema 的有效包B: {T:(key:chararray, value:chararray)}

{(Name,Foo),(Age,Bar)}
{(Age,25),(Name,Jim)}
{(Name,Bob)}
{(Age,30),(Name,Roger),(Hair Color,Brown)}
{(Hair Color,),(Name,Victor)} -- Note the Null value for Hair Color

但是,听起来您真的想要一张地图:

myudf.py

@outputSchema('M:map[]')
def mapize(the_input):
    out = {}
    for kv in the_input.split(' '):
        k, v = kv.split(':')
        out[k] = v
    return out

我的脚本.pig

register '../myudf.py' using jython as myudf ;

A = LOAD 'filename.log' AS (total:chararray) ; 
B = FOREACH A GENERATE myudf.mapize(total) ;

-- Sample usage, grouping by the name key.
C = GROUP B BY M#'Name' ;

使用#运算符,您可以使用您提供的键从地图中提取所有值。您可以在此处阅读有关地图的更多信息。

于 2013-08-12T21:43:48.387 回答