在PIG中加载多个文件的多个输出
问题描述:
我在我的数据目录(路径:/ home/admin/Desktop/data)中有50个文本文件。我的任务是压扁(标记)文本文件中的数据并将输出存储在50个输出文件中。在PIG中加载多个文件的多个输出
以下是我提出来完成这项工作的关系:现在,当我执行这个脚本的猪,我只得到一个输出文件50个输入文件
--This will load all the 50 text files.
A = Load '/home/admin/Desktop/data' Using PigStorage(',');
--This relation will create every word as a token and will flatten the data.
B = FOREACH A GENERATE FLATTEN(TOKENIZE($0));
STORE B into '/home/ameya/Desktop/PigOutput';
。
如何获得50个不同的输出文件,每个文件都包含与输入文件中的数据相对应的输出数据?
答
如果您想为单独的50个i/p文件创建50个o/p文件,那么最好运行您的PIG脚本50次(在一个循环中)并使用i/p文件和o/p文件作为参数你的PIG脚本。
+0
按我的知识Multistorage UDF是分裂的输出数据为动态地根据用户指定的键不同的目录有用字段在输出元组中。 但我不知道输入文件中有什么。所以无法定义分割数据的关键 –
答
Split运算符可用于根据某个表达式将关系的内容划分为两个或更多个关系。基于在任一下面的两个表达式提供的条件来完成:
- 的元组可被分配给一个以上的关系
- 的元组可以不被分配给任何关系
多个文件,其在猪用于加载,压平并存储:
[[email protected] ~]# ls /pigsamples/mfilesdata/
file1 file2 file3
加载上述目录:
grunt> input_data = LOAD '/pigsamples/mfilesdata' USING PigStorage (',') AS (f1:INT, f2:INT, f3:INT);
grunt> DUMP input_data;
(1,2,3)
(2,3,1)
(3,1,2)
(4,5,6)
(5,6,4)
(6,4,5)
(7,8,9)
(8,9,7)
(9,7,8)
根据您的要求格式化数据。我采用了与问题中相同的操作。
grunt> formatted_data = FOREACH input_data GENERATE FLATTEN(TOKENIZE($0)); //replace with your requirements
使用SPLIT
运算符根据条件将关系拆分为多个关系。
grunt>
SPLIT formatted_data
INTO split1 IF f1 <= 3,
split2 IF (f1 > 3 AND f1 <= 6),
split3 IF f1 > 6; //split based on the column which is unique within all the files
输出:
grunt> DUMP split1;
(1,2,3)
(2,3,1)
(3,1,2)
grunt> DUMP split2;
(4,5,6)
(5,6,4)
(6,4,5)
grunt> DUMP split3;
(7,8,9)
(8,9,7)
(9,7,8)
感谢队友在正确的方式添加注释:) –