说我有一些像
这样的日志key1 something
key2 something
key3 something
我可以使用Pig MultiStorage根据密钥将记录输出到多个文件夹。但是在MultiStorage中有什么方法我可以确保每个键输出只包含一个文件,而不是多个小文件可以包含多个小文件。
答案 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
将存储相应键值的结果。