【【Pig源码分析】谈谈源码分析】谈谈Pig的数据模型的数据模型
1. 数据模型
Schema
Pig Latin表达式操作的是relation,FILTER、FOREACH、GROUP、SPLIT等关系操作符所操作的relation就是bag,bag为
tuple的集合,tuple为有序的field列表集合,而field表示数据块(A field is a piece of data),可理解为数据字段。
Schema为数据所遵从的类型格式,包括:field的名称及类型(names and types)。用户常用as语句来自定义schema,或是
load函数导入schema,比如:
A = foreach X generate .. as field1:chararray, .. as field2:bag{};
A = load '..' using PigStorage(' ', '-schema');
A = load '..' using org.apache.pig.piggybank.storage.avro.AvroStorage();
若不指定field的类型,则其默认为bytearray。对未知schema进行操作时,有:
若join/cogroup/cross多关系操作遇到未知schema,则会将其视为null schema,导致返回结果的schema也为null;
若flatten一个empty inner schema的bag(即:bag{})时,则返回结果的schema为null;
若union时二者relation的schema不一致,则返回结果的schema为null;
若field的schema为null,会将该字段视为bytearray。
为了保证pig脚本运行的有效性,在写UDF时要在outputSchema方法中指定返回结果的schema。
数据类型
Pig的基本数据类型与对应的Java类:
复杂数据类型及其对应的Java类:
Pig的复杂数据类型可以嵌套表达,比如:tuple中有tuple (a, (b, c, d)),tuple中有bag (a, {(b,c), (d,e)})等等。但是一定要遵从
数据类型本身的定义,比如:bag中只能是tuple的集合,比如{a, {(b),(c)}}就是不合法的。
Pig还有一种特殊的数据类型:null,与Java、C中null不一样,其表示不知道的或不存在的数据类型(unknown or non-
existent)。比如,在load数据时,如果有的数据行字段不符合定义的schema,则该字段会被置为null。
2. 源码分析
以下源码分析采用的是0.12版本。
Tuple
在KEYSET源码中,创建Tuple对象采用工厂+单例设计模式: