无法在Pig Script中使用双管分隔符提取数据

时间:2016-08-05 07:11:31

标签: apache-pig hadoop2

我正在尝试提取Pig中管道分隔的数据。以下是我的命令

L = LOAD 'entirepath_in_HDFS/b.txt/part-m*' USING PigStorage('||');

我得到以下错误

2016-08-04 23:58:21,122 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: Pig script failed to parse:
<line 1, column 4> pig script failed to validate: java.lang.RuntimeException: could not instantiate 'PigStorage' with arguments '[||]'

我的输入样本文件正好有5行,如下所示

POS_TIBCO||HDFS||POS_LOG||1||7806||2016-07-18||1||993||0
POS_TIBCO||HDFS||POS_LOG||2||7806||2016-07-18||1||0||0
POS_TIBCO||HDFS||POS_LOG||3||7806||2016-07-18||1||0||5
POS_TIBCO||HDFS||POS_LOG||4||7806||2016-07-18||1||0||0
POS_TIBCO||HDFS||POS_LOG||5||7806||2016-07-18||1||0||19.99

我尝试了几个选项,例如在分隔符(\ ||,\ | \ |)之前使用反斜杠但是一切都失败了。此外,我尝试使用架构,但得到了相同的错误。我正在使用Horton作品(HDP2.2.4)和猪(0.14.0)。

感谢任何帮助。如果您需要任何进一步的细节,请告诉我。

2 个答案:

答案 0 :(得分:1)

我遇到过这种情况,通过检查PigStorage code source,我认为PigStorage参数应该只解析为一个字符。

所以我们可以改用这段代码:

L0 = LOAD 'entirepath_in_HDFS/b.txt/part-m*' USING PigStorage('|');
L = FOREACH L0 GENERATE $0,$2,$4,$6,$8,$10,$12,$14,$16;

如果你知道你有多少列,它会有所帮助,并且它不会影响性能,因为它的地图方面。

答案 1 :(得分:0)

使用PigStorage加载数据时,它只需要单个字符作为分隔符。 但是,如果您仍想实现此目的,可以使用 MyRegExLoader -

REGISTER '/path/to/piggybank.jar'
A = LOAD '/path/to/dataset' USING org.apache.pig.piggybank.storage.MyRegExLoader('||') 
      as (movieid:int, title:chararray, genre:chararray);