Apache pig 如何从文本文件生成架构?(Hadoop猪)

Apache pig 如何从文本文件生成架构?(Hadoop猪),apache-pig,Apache Pig,不知怎的,我得到了filename.log,它看起来像示例(以选项卡分隔) 因为key column的值可能不同,所以在像这样加载文本时无法定义模式 a = load 'filename.log' as (Name:chararray,Age:int); 我也不想像这样按位置调用列 b = foreach a generate $0,$1; 例如,我想做的是,仅从filename.log开始,就可以通过键调用每个值 a = load 'filename.log' using PigStora

不知怎的,我得到了filename.log,它看起来像示例(以选项卡分隔)

因为key column的值可能不同,所以在像这样加载文本时无法定义模式

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;
为此,我编写了一些JavaUDF,将元组中每个字段的key:value和get-value分开,如下所示

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;
        }
    }
}
public类SPLITALLGETCOL2扩展了EvalFunc{
@凌驾
公共元组执行(元组输入){
TupleFactory mTupleFactory=TupleFactory.getInstance();
ArrayList mProtoTuple=新的ArrayList();
元组输出;
字符串目标=input.toString().substring(1,input.toString().length()-1);
字符串[]标记化=target.split(“,”);
试一试{

对于(int i=0;i无论您做什么,都不要使用元组来存储输出。元组用于存储固定数量的字段,您知道每个字段包含哪些内容。因为您不知道键将以名称、年龄形式存在(甚至存在,或者不会有更多)您应该使用a。包是无序的元组集。只要元组具有相同的架构,它们可以包含任意数量的元组。这些都是架构
B:{T:(key:chararray,value:chararray)}

但是,听起来您确实想要一张地图:

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
myscript.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' ;

使用
#
操作符,您可以使用给定的键从地图中提取所有值。您可以阅读有关地图的更多信息。

我已更新了我的答案,并提供了更多信息。请告诉我如何改进或使其更有帮助!
@outputSchema('M:map[]')
def mapize(the_input):
    out = {}
    for kv in the_input.split(' '):
        k, v = kv.split(':')
        out[k] = v
    return out
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' ;