首页 > 代码库 > PIG中的null问题

PIG中的null问题

 在比较操作(==,!=,>,<,>=,<=),matches,算数操作(+,-,*,/ ,包含%,?,CASE)中,如果有一个操作数为空,那么结果为空。

COUNT_STAR ,不过滤null数据

CAST 操作:将一个null数据从一个数据类型转换到另一个数据类型,结果为空

AVG,MIN,MAX,SUM,COUNT :这几个操作将忽略空值

CONCAT :任意一个字表达式为空,结果为空

SIZE :任意计算的对象为null,结果也为null

tuple(.) or map(#):如果 被引用的对象为空,那么结果为空 。

FILTER 操作 :如果一个filter的表达式为空,filter将不会拒绝操作。(eg :b = filter a by X!=5 ,如果X为空,!X也为空,X!=5 将为空,那么filter将不会处理这一行数据。)

三元操作符 ? :如果一个bool表达式的结果为null,结果将为空。


以下操作会产生nulls :
1、除0
2、用户的UDFs
3、引用一个不存在的字段
4、引用一个map中不存在的字段
5、引用一个tuple中不存在的字段
6、load不存在的数据时产生null,空字符串不会被load,会被替换成null
null可以作为一个常量使用 。
7、load时数据类型不匹配产生null


GROUP /COGROUP/JOIN:
当使用group来处理一个关系时,一个关系中的null会被聚集在一起当做一个null处理 。
当cogroup来处理多个关系是,如果有key为空的情况时,多个关系之间的的空是不一样的,会被分别当做不同的null key来处理。

JOIN :
数据 :
a :
1       5
         4
3       6

b :
1       7
2       8
        10

JOIN【inner】如:join中空和空是匹配不上的,会被过滤掉 。在join之前过滤出key为空的数据 ,有助于提高join的速度。
a = load ‘./t1.txt‘ as (a1:int,a2:int);
b = load ‘./t2.txt‘ as (b1:int,b2:int);
c= join a by a1,b by b1 ;
dump c ;
(1,5,1,7)

JOIN【outer】
d = join a by a1 left,b by b1 ;
dump d ;
(1,5,1,7)
(3,6,,)
(,4,,)

d = join a by a1 right,b by b1;
dump d ;
(1,5,1,7)
(,,2,8)
(,,,10)

d = join a by a1 full,b by b1;
dump d ;
(1,5,1,7)
(,,2,8)
(3,6,,)
(,4,,)
(,,,10)