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';

一吨,我没有什么疑问。什么是[\(]+,[\\\'],[\)\\\']+;你能描述一下这些“\.”的意义吗。如果你有任何相关的链接来阅读这些,请把它也传给我。补充说明。请检查。很棒,很好的解释。非常感谢。