Apache pig 如何从文本文件生成架构?(Hadoop猪)
不知怎的,我得到了filename.log,它看起来像示例(以选项卡分隔) 因为key column的值可能不同,所以在像这样加载文本时无法定义模式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
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' ;