【问题标题】:Remove single quotes from data using Pig使用 Pig 从数据中删除单引号
【发布时间】:2015-05-21 02:09:09
【问题描述】:

这就是我的数据的样子

(10, 'ACCOUNTING', 'NEW YORK')
(20, 'RESEARCH', 'DALLAS')
(30, 'SALES', 'CHICAGO')
(40, 'OPERATIONS', 'BOSTON')

我想使用 Pig 脚本从该数据中删除 ()'。我希望我的数据看起来像这样-

10, ACCOUNTING, NEW YORK
20, RESEARCH, DALLAS
30, SALES, CHICAGO
40, OPERATIONS, BOSTON

我很长时间以来一直坚持这一点。请帮忙。提前致谢。

【问题讨论】:

    标签: apache-pig bigdata


    【解决方案1】:

    你能用下面的正则表达式试试REPLACE 函数吗?

    说明:
    在正则表达式中,很少有字符具有特殊含义\ ^ $ . , | ? * + ( ) [ {。这些特殊字符称为“metacharacters”。 如果您想使用这些字符中的任何一个作为您的正则表达式的一部分,那么您需要escape them with a single backslash。在我们的例子中 Pig uses Java based regex engine 所以所有的 specials characters needs be escaped with double backslash (Java 使用 \\ 双反斜杠来区分特殊字符)。

    从您的输入中删除 '(' ')' and '(single quote) 字符。
    1. 只需将() 替换为双反斜杠\\(\\)
    2.'(single quote)是Pig(default string literal)中的特殊字符,所以这也需要双反斜杠来消除特殊含义,但双反斜杠doesn't convince pig parser(you will get error for double backslash)这就是我使用three backslash作为单引号@987654335的原因@ 删除特殊含义。
    3. [] is character class,这将只匹配几个字符中的一个。只需将字符放在要匹配的方括号内,即。在我们的例子中是[()']
    4. + symbol 用于匹配一个或多个字符。

    输入

    (10, 'ACCOUNTING', 'NEW YORK')
    (20, 'RESEARCH', 'DALLAS')
    (30, 'SALES', 'CHICAGO')
    (40, 'OPERATIONS', 'BOSTON')
    

    PigScript1:

    A = LOAD 'input' AS (line:chararray);
    B = FOREACH A GENERATE REPLACE(line,'[\\\'\\(\\)]+','');
    STORE B INTO 'output';
    

    Pigscript2:

    A = LOAD 'input' USING PigStorage(',') AS (col1:chararray,col2:chararray,col3:chararray);
    B = FOREACH A GENERATE REPLACE(col1,'[\\(]+',''),REPLACE(col2,'[\\\']',''),REPLACE(col3,'[\\)\\\']+','');
    STORE B into 'output1' USING PigStorage(',');
    

    输出:将存储在 output/part-m-00000 文件中

    10, ACCOUNTING, NEW YORK
    20, RESEARCH, DALLAS
    30, SALES, CHICAGO
    40, OPERATIONS, BOSTON
    

    【讨论】:

    • Thnx 很多,我几乎没有疑问。什么是 [\(]+, [\\\'], [\)\\\']+ ;您能否描述一下这些“\”的意义。如果你有任何相关的链接来阅读这些,请也把它传给我。
    • 添加说明。请检查一下。
    • 太棒了,很好的解释。非常感谢。
    【解决方案2】:

    当您的数据使用双引号而不是单引号时,以下将起作用。

    loaded = LOAD 'input' AS (row:chararray);
    formatted = FOREACH loaded GENERATE REPLACE(row,'[\\"\\(\\)]+','');
    STORE formatted INTO 'hdfs_output';
    

    --并且要使用更正的数据,您可以照常加载它

    formatted_data = LOAD 'hdfs_output' USING PigStorage('$DELIMITER','-noschema') AS (column_name:datatype,..etc);
    

    【讨论】:

      【解决方案3】:

      当您的数据有双引号时,这里可能更简单,因为它不使用正则表达式:

      A = LOAD 'input' AS (line:chararray);
      B = FOREACH A GENERATE REPLACE(line,'"','');
      STORE B INTO 'output';
      

      【讨论】:

        【解决方案4】:

        当您知道您的第一列是数字值而其余列是字符时,您也可以采用以下方法。

        使用分隔符加载文件,

        sam = 使用 PigStorage(',') 加载 'sample.txt';

        sam1 = foreach sam generate REPLACE($0,'([^0-9\\s]+)',''),REPLACE($1,'([^A-Za-z\\s]+) ',''),REPLACE($2,'([^A-Za-z\\s]+)','');

        你会得到以下输出:

        (10,会计,纽约)

        (20,研究,达拉斯)

        (30,销售,芝加哥)

        (40,运营,波士顿)

        【讨论】:

          猜你喜欢
          • 2019-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-06
          • 1970-01-01
          • 2022-01-08
          • 2014-03-06
          • 1970-01-01
          相关资源
          最近更新 更多