Pig MultiStorage输出到单个文件

时间:2015-01-13 19:01:35

标签: hadoop apache-pig

说我有一些像

这样的日志
key1 something
key2 something
key3 something

我可以使用Pig MultiStorage根据密钥将记录输出到多个文件夹。但是在MultiStorage中有什么方法我可以确保每个键输出只包含一个文件,而不是多个小文件可以包含多个小文件。

1 个答案:

答案 0 :(得分:1)

默认情况下,MultiStorage会将相同的密钥存储在一个文件中,因此您无需执行任何操作。在下面的示例中,不同输入文件中有4个键,在使用MultiStorage选项存储键后,它将创建4个目录(key1,key2,key3 and key4)并将相应的值存储在单个文件中。在MultiStorage选项中,'0'只是column 0

<强> INPUT1

key1,aaaa
key2,bbbb
key3,cccc
key2,bbbb
key3,eeee
key3,ffff

<强>输入2

key1,zzzz
key2,xxxx
key4,cccc
key3,yyyy
key4,ffff

<强>输入3:

key1,iiii
key2,jjjj
key3,kkkk
key4,llll

<强> PigScript:

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

输出$ ls

_SUCCESS    key1        key2        key3        key4

输出$ cat key1 / key1-0,000

key1    aaaa
key1    zzzz
key1    iiii

输出$ cat key2 / key2-0,000

key2    bbbb
key2    bbbb
key2    xxxx
key2    jjjj

输出$ cat key3 / key3-0,000

key3    cccc
key3    eeee
key3    ffff
key3    yyyy
key3    kkkk

输出$ cat key4 / key4-0,000

key4    cccc
key4    ffff
key4    llll

<强>选项2:
另一个选项是使用SPLIT命令将相同的密钥存储在单个文件中。

<强> PigScript:

A = LOAD 'input' USING PigStorage(',') AS (f1,f2);
SPLIT A INTO k1 IF (f1=='key1'), k2 IF (f1=='key2'), k3 IF (f1=='key3');
STORE k1 INTO 'OutputKey1' USING PigStorage();
STORE k2 INTO 'OutputKey2' USING PigStorage();
STORE k3 INTO 'OutputKey3' USING PigStorage();

现在输出目录OutputKey1,OutputKey2,OutputKey3将存储相应键值的结果。