如何使用Pig识别数据中的'\ N'字符

时间:2016-01-01 06:02:04

标签: regex hadoop apache-pig

我的数据中出现了非常奇怪的字符'\ N'。我想从数据中删除或替换此字符。以下是数据样本:

Girls Shoes,1325051884
\N,\N
Men's Shirts,\N

分隔符:逗号(,)

我尝试了几种方法来替换/识别这个\ N字符但不起作用。

2 个答案:

答案 0 :(得分:1)

在Pig中,位置符号用美元符号($)表示,并以零(0)开头;例如,$ 0,$ 1,$ 2.

因此,在上面提到的数据中,第一个字段由$ 0标识(例如" Girls Shoes"),第二个字段由$ 1标识(例如1325051884)。

以下脚本具有替换' \ N':

的逻辑
A = LOAD '/data.txt' USING PigStorage(','); 
B = FILTER A BY ($0 != '\\N') OR ($1 != '\\N');
dump B;
C = FOREACH B GENERATE ($0 == '\\N' ? '' : $0), ($1 == '\\N' ? '' : $1);
dump C;

在哪里' /data.txt'包含以下数据:

Girl's Shoes,1325051884
\N,\N
Men's Shirts,\N
\N,Boy's Pants

<强>逻辑:

  1. A = LOAD '/data.txt' USING PigStorage(',');

    通过假定分隔符为逗号(,)来加载数据。

  2. B = FILTER A BY ($0 != '\\N') OR ($1 != '\\N');

    对于每个加载的记录,按条件过滤记录:$ 0(第一个字段)NOT EQUALS&#39; \ N&#39; OR $ 1(第二个字段)NOT EQUALS&#39; \ N&#39;

    此阶段的输出将是(包含&#39; \ N&#39;的第二条记录被过滤掉):

    (Girl's Shoes,1325051884)
    (Men's Shirts,\N)
    (\N,Boy's Pants)
    
  3. C = FOREACH B GENERATE ($0 == '\\N' ? '' : $0), ($1 == '\\N' ? '' : $1);

    对于第二步中生成的每条记录,它会检查:如果$ 0等于&#39; \ N&#39;。如果是,它会发出空白(&#39;&#39;),否则会发出$ 0。类似的逻辑适用于$ 1.

    这个阶段的输出将是:

    (Girl's Shoes,1325051884)
    (Men's Shirts,)
    (,Boy's Pants)
    

    你可以看到,&#39; \ N&#39;被替换为空白(&#39;&#39;)。

  4. 我正在使用Apache Pig 0.15。此脚本非常适合您的数据。

答案 1 :(得分:0)

A = FILTER data by $2 =='//N'

它将列出具有此类字符外观的所有数据。