使用 Pig 从数据中删除单引号
Remove single quotes from data using Pig
这是我的数据的样子
(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
我很长一段时间都坚持这个。请帮忙。提前致谢。
你能用下面的正则表达式试试 REPLACE
函数吗?
解释:
在 Regex 中很少有字符具有特殊含义 \ ^ $ . , | ? * + ( ) [ {
。这些特殊字符称为“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
用于单引号 \\'
去除特殊含义。
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
当您的数据使用双引号而不是单引号时,以下将起作用。
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);
当您意识到第一列是数值而其余列是字符时,您也可以采用以下方法。
正在加载分隔符为 ,
的文件
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,操作,波士顿)
当您的数据有双引号时,这里可能更简单,因为它不使用正则表达式:
A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(line,'"','');
STORE B INTO 'output';
这是我的数据的样子
(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
我很长一段时间都坚持这个。请帮忙。提前致谢。
你能用下面的正则表达式试试 REPLACE
函数吗?
解释:
在 Regex 中很少有字符具有特殊含义 \ ^ $ . , | ? * + ( ) [ {
。这些特殊字符称为“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
用于单引号 \\'
去除特殊含义。
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
当您的数据使用双引号而不是单引号时,以下将起作用。
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);
当您意识到第一列是数值而其余列是字符时,您也可以采用以下方法。
正在加载分隔符为 ,
的文件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,操作,波士顿)
当您的数据有双引号时,这里可能更简单,因为它不使用正则表达式:
A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(line,'"','');
STORE B INTO 'output';