使用相同的 Pig 脚本存储多个文件

Posted

技术标签:

【中文标题】使用相同的 Pig 脚本存储多个文件【英文标题】:Store multiple file Using Same Pig Script 【发布时间】:2014-12-12 20:43:14 【问题描述】:

文件有数据:

A 12345
B 32122
C 23232

什么是只运行一次猪脚本并将第一个 record(A 12345) 存储在一个文件中的选项,second record(B 32122) 在第二个文件中,third(c 23232) 在第三个文件中。现在,如果我们运行 pig 脚本,它将为每个商店运行该作业。请让我知道选项。

【问题讨论】:

嗨 Siva....对上述问题的任何评论。 【参考方案1】:

使用 SPLIT 运算符根据某个表达式将关系的内容划分为两个或多个关系。根据表达式中所述的条件:

A tuple may be assigned to more than one relation.

A tuple may not be assigned to any relation.

例子

在此示例中,关系 A 被拆分为三个关系,X、Y 和 Z。

A = LOAD 'data' AS (f1:int,f2:int,f3:int);

DUMP A;                
(1,2,3)
(4,5,6)
(7,8,9)        

SPLIT A INTO X IF f1<7, Y IF f2==5, Z IF (f3<6 OR f3>6);

DUMP X;
(1,2,3)
(4,5,6)

DUMP Y;
(4,5,6)

DUMP Z;
(1,2,3)
(7,8,9)

然后根据您的文件名存储 X、Y、Z

我的目标是读取文件并根据标准将记录写入不同的文件它将适合您的问题。

【讨论】:

是的,你是对的,基于过滤的商店 SPLIT 是正确的选择。 嗨 Siva/Kishore。感谢您的回复。实际上我使用过滤器尝试了此选项,但我的主要目的是过滤或拆分并使用相同的一次执行存储 X、Y、Z。在上面的示例中,脚本将运行 3 次,x 运行 1 次,y 运行 2 次,Z 运行 3 次。我正在尝试是否有任何选项,其中 x,y,z 应该只存储在一次执行中。【参考方案2】:

其实猪不是为此而生的。但是,如果您想这样做,则必须编写自定义存储功能。将不得不编写一些扩展 StoreFunc 类的类。更进一步,它必须使用多个输出,因为您想存储在 3 个不同的文件中。

自定义存储功能请参考https://pig.apache.org/docs/r0.7.0/udf.html#Store+Functions。

否则在 pig 中,一个 store 命令将只存储一个别名,只存储在一个文件中。

这样的需求最好写JAVA MR。

【讨论】:

【参考方案3】:

您可以尝试使用 MultiStorage() 选项,它将在 piggybank jar 中提供。您需要下载 pig-0.11.1.jar 并将其设置在您的类路径中。

示例:input.txt

A 12345
B 32122
C 23232

PigScript:

A = LOAD 'input.txt' USING PigStorage(' ') AS (f1,f2);
STORE A INTO 'output' USING org.apache.pig.piggybank.storage.MultiStorage('output', '0');

现在输出文件夹包含 3 个目录 A、B、C文件名(A-0,000 、B-0,000 和 C-0,000 ) 包含实际值输出$ ls

A       B       C       _SUCCESS

输出$ cat A/A-0,000

A   12345

输出$ cat B/B-0,000

B   32122

输出$ cat C/C-0,000

C   23232

【讨论】:

谢谢你 siva...你的意思是我们可以使用多重存储来存储基于某些条件的记录。例如,在一个文件中,我们有一个名为 age 的字段,它有 2 条记录,一条是 17 条,另一条是 19 条。如果我想根据这个过滤器存储一个文件中的年龄 > 18 并且小于或等于另一个文件。我们能做到这一点吗?我试图避免多次运行。 此链接将帮助您如何使用所有选项。 pig.apache.org/docs/r0.10.0/api/org/apache/pig/piggybank/… 不,你不能那样使用,但如果找到一些解决方案我会更新。 谢谢湿婆。我的目标是读取一个文件并根据标准将记录写入不同的文件。根据上面的示例,我们可以通过使用 2 个存储将记录写入 2 个文件,但脚本将执行 2 次。我想避免 2 次运行,并且必须在一次运行中达到相同的结果。请更新我的选项。非常感谢。你摇滚! Jagan,你可以试试kishore提供的解决方案。我认为它对你有用。

以上是关于使用相同的 Pig 脚本存储多个文件的主要内容,如果未能解决你的问题,请参考以下文章

Pig 脚本:加入多个文件

PIG 脚本根据特定单词将大型文本文件拆分为多个部分

用于过滤多个字符串上的文件的 Pig 脚本/命令

Pig:更改输出文件 NAME 的格式

用于压缩和解压缩 bzip2 中的 hdfs 数据的 Pig 脚本

pig - 包含多个 jar 的注册目录