[原创] 使用Apache DataFu中的Coalesce()简化Apache Pig的三元运算符

来看这个例子。有数据文件 1.txt,内容为:

a[\t][\t]c
[\t]f[\t]g
h[\t]k[\t]
[\t][\t][\t]
其中 [\t] 表示制表符(tab),并不是真的在文件中写了 [\t]
在Pig命令行交互模式下加载这个文件,并把其中为空(NULL)的列替换成一些数字:

A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray);
B = FOREACH A GENERATE (col1 IS NOT NULL ? col1 : '1') AS col1, (col2 IS NOT NULL ? col2 : '2') AS col2, (col3 IS NOT NULL ? col3 : '3') AS col3;
DUMP B;

输出:

(a,2,c)
(1,f,g)
(h,k,3)
(1,2,3)

代码非常简单:如果第一列col1为空则替换为1,如果第二列为空则替换为2,如果第三列为空则替换为3。
这里使用了三元运算符 ? : 来做这个判断,写法非常丑陋。

如果要实现更麻烦的逻辑,“取第一列、第二列、第三列中,第1个不为空的列作为结果,如果全为空则取888”:

A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray);
B = FOREACH A GENERATE (col1 IS NOT NULL ? col1 : (col2 IS NOT NULL ? col2 : (col3 IS NOT NULL ? col3 : '888'))) AS col;
DUMP B;

输出:

(a)
(f)
(h)
(888)

这代码是真•丑出天际。
文章来源:https://www.codelast.com/
这时,我们就可以使用Apache DataFu中的 Coalesce() 函数来简化代码。

Apache DataFu™是用于在Hadoop中处理大规模数据的库的集合。
Coalesce()的功能:
返回一个元组(tuple)的第一个非空值,就像SQL中的Coalesce一样。
简化上面的第一段代码:

DEFINE Coalesce datafu.pig.util.Coalesce();

A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray);
B = FOREACH A GENERATE Coalesce(col1, '1') AS col1, Coalesce(col2, '2') AS col2, Coalesce(col3, '3') AS col3;
DUMP B;

输出结果完全一样。
文章来源:https://www.codelast.com/
简化上面的第二段代码:

DEFINE Coalesce datafu.pig.util.Coalesce();

A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray);
B = FOREACH A GENERATE Coalesce(col1, col2, col3, '888') AS col;
DUMP B;

三元运算符嵌套的层数越多,使用Coalesce能简化得就越多。

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注