使用Same Pig Script存储多个文件

时间:2014-12-12 20:43:15

标签: hadoop apache-pig hdfs

文件有数据:

A 12345
B 32122
C 23232

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

3 个答案:

答案 0 :(得分:0)

实际上猪不是为此而制造的。但是如果你想这样做,那么就必须编写自定义商店功能。将不得不编写一些扩展StoreFunc类的类。在内部它将不得不使用多个输出,因为你想存储3个不同的文件。

请参阅https://pig.apache.org/docs/r0.7.0/udf.html#Store+Functions了解自定义商店功能。

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

对于这种要求,你可以更好地编写JAVA MR。

答案 1 :(得分:0)

您可以尝试使用 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 dirs 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

答案 2 :(得分:0)

使用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

我的目标是根据标准读取文件并将记录写入不同的文件中。