这就是我的数据
(10, 'ACCOUNTING', 'NEW YORK')
(20, 'RESEARCH', 'DALLAS')
(30, 'SALES', 'CHICAGO')
(40, 'OPERATIONS', 'BOSTON')
我想使用Pig Script从此数据中删除(
,)
和'
。我希望我的数据看起来像这样 -
10, ACCOUNTING, NEW YORK
20, RESEARCH, DALLAS
30, SALES, CHICAGO
40, OPERATIONS, BOSTON
我很长时间都坚持这个。请帮忙。提前谢谢。
答案 0 :(得分:2)
您可以使用以下正则表达式尝试REPLACE
功能吗?
<强>解释强>
在正则表达式中,很少有字符具有特殊含义\ ^ $ . , | ? * + ( ) [ {
。这些特殊字符称为&#34; metacharacters
&#34;。
如果您想将这些字符中的任何一个用作正则表达式的一部分,那么您需要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
单引号\\\'
以删除特殊含义
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
答案 1 :(得分:0)
如果您的数据有双引号而不是单引号,则可以使用。
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);
答案 2 :(得分:0)
当您的数据有双引号时,这可能更容易,因为它不使用正则表达式:
A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(line,'"','');
STORE B INTO 'output';
答案 3 :(得分:-1)
如果您发现第一列是数字值而其余列是持有字符,您也可以采用以下方法。
使用分隔符加载文件,
sam =使用PigStorage(',');
加载'sample.txt'sam1 = foreach sam生成REPLACE($ 0,'([^ 0-9 \\ s] +)',''),REPLACE($ 1,'(([^ A-Za-z \\ s] +) ”, ''),REPLACE($ 2, '([^ A-ZA-Z \\ S] +)', '');
您将获得以下输出:
(10,ACCOUNTING,NEW YORK)
(20,RESEARCH,DALLAS)
(30,SALES,CHICAGO)
(40,OPERATIONS,BOSTON)