查看更多Apache Pig的教程请点击这里。
来看这个例子。有数据文件 1.txt,内容为:
a[\t][\t]c[\t]f[\t]gh[\t]k[\t]
[\t][\t][\t]
其中 [\t] 表示制表符(tab),并不是真的在文件中写了 [\t]。
在Pig命令行交互模式下加载这个文件,并把其中为空(NULL)的列替换成一些数字:
在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能简化得就越多。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):
以及我的微信视频号: