我使用pig脚本从CSV中删除了一些列:
Cleaned = FOREACH data generate $0 .. $8,$11 .. $27, $31 .. $41, $45 .. $97, $99 .. $111;
在我保留的列中,我需要去掉任何可能损坏hive中数据的新行字符。可以是n
, r
, rn
, <br>
。由于它是用户输入的数据,我相信在使用enter键输入数据时创建的换行符将是上面提到的字符之一,如果您还可以指定它转换为什么,我会很感激,但在大多数情况下,我需要确保任何类型的换行符被从数据中删除,以确保我的数据被hive CSV Parser正确映射。我如何在我用来过滤掉列的pig脚本中做到这一点?
编辑:1。我希望继续使用列范围,而不必指定每个列。2. 上面的例子并不包括所有类型的换行符
由于您有大量的列,您最好将数据加载为line:chararray
,然后使用REPLACE
函数。一旦数据被清理,您可以使用STRSPLIT
将行分割成列,然后使用范围来获得所需的列。
A = LOAD 'data.csv' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(REPLACE(REPLACE(REPLACE(line,'\n',''),'\r',''),'\r\n',''),'<br>','');
C = FOREACH B GENERATE FLATTEN(STRSPLIT($0,','));
D = FOREACH C GENERATE $0 .. $8,$11 .. $27, $31 .. $41, $45 .. $97, $99 .. $111;
DUMP D;
您可以使用"org.apache.pig.piggybank.storage.CSVExcelStorage(',')"存储类导入数据,然后您可以使用replace命令将"new line"字符替换为字段中的数据。
/usr/lib/pig/piggybank.jar登记;a = LOAD '/path/to/file.csv' USING org.apache.pig.piggybank.storage.CSVExcelStorage(',')b = FOREACH $1;转储b
Piggybank是提供的默认jar,所以不需要注册就可以使用。