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

Posted

技术标签:

【中文标题】无法在 Pig 脚本中使用双管道分隔符提取数据【英文标题】:Unable to extract data with double pipe delimiter in Pig Script 【发布时间】:2016-08-05 07:11:31 【问题描述】:

我正在尝试提取在 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

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

感谢任何帮助。如果您需要更多详细信息,请告诉我。

【问题讨论】:

复制:***.com/questions/38800108/… 【参考方案1】:

我遇到过这种情况,通过检查PigStoragecode 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;

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

【讨论】:

感谢您的详细解决方案。实际上我们的数据可能只有一个管道。所以源正在发送由双管道分隔的数据。有没有办法将双管道作为分隔符?【参考方案2】:

当您使用 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);

【讨论】:

在哪里可以找到 piggybank.jar?

以上是关于无法在 Pig 脚本中使用双管道分隔符提取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用管道连字符管道将数据加载到 Pig |-|分隔符

Pig CSVExcelStorage 双引号逗号

Bigquery - 在 CSV(联合表)中处理双引号和管道字段分隔符

具有多个分隔符的 apache pig 加载数据

Pig — 如何加载包含用双引号括起来并用逗号分隔的字段的 CSV 文件

在 hive 的一列中加载具有“(双引号)的管道分隔 CSV 数据