Apache pig 使用Pig从数据中删除单引号
这就是我的数据Apache pig 使用Pig从数据中删除单引号,apache-pig,bigdata,Apache Pig,Bigdata,这就是我的数据 (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 我被这
(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
我被这个问题困扰了很长时间。请帮忙。提前感谢。您可以尝试用下面的正则表达式替换
函数吗
说明:
在正则表达式中,很少有字符具有特殊含义()[{
。这些特殊字符称为“元字符
”。
如果您想将这些字符中的任何一个用作正则表达式的一部分,那么您需要用一个反斜杠对它们进行转义
。在我们的例子中Pig使用基于Java的正则表达式引擎
,因此所有特殊字符都需要用双反斜杠转义(Java使用\\双反斜杠来区分特殊字符)
从输入中删除(“”)和“(单引号)
字符。
1.只需将()
替换为双反斜杠\\(\\)
2.”(单引号)
是Pig中的特殊字符(默认字符串文字)
,因此这也需要双反斜杠来删除特殊含义,但双反斜杠无法说服Pig解析器
(双反斜杠
会出现错误)这就是我在单引号中使用三个反斜杠的原因。
3.[]是字符类
,这将只匹配几个字符中的一个。只需将字符放在要匹配的方括号内即可。在本例中,它是[()']
4.+符号
用于匹配一个或多个字符
输入
(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';
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(',');
Pigscript2:
A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(line,'[\\\'\\(\\)]+','');
STORE B INTO 'output';
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(',');
输出:将存储在输出/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生成替换($0’([^0-9\\s]+),“”),替换($1’([^A-Za-z]+),“”),替换($2’([^A-Za-z]+),“”)
您将获得以下输出:
(10,会计,纽约)
(20日,达拉斯研究所)
(30,芝加哥销售部)
(40,波士顿运营部)当您的数据有双引号时,此处可能更简单,因为它不使用正则表达式:
A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(line,'"','');
STORE B INTO 'output';
一吨,我没有什么疑问。什么是[\(]+,[\\\'],[\)\\\']+;你能描述一下这些“\.”的意义吗。如果你有任何相关的链接来阅读这些,请把它也传给我。补充说明。请检查。很棒,很好的解释。非常感谢。