我有一个简单的文本文件,其中包含某些FTP服务器上的文件夹列表。每行都是一个单独的文件夹。每个文件夹包含几千个图像。我想连接到每个文件夹,将该foder中的所有文件存储在SequenceFile
中,然后从FTP服务器中删除该文件夹。我为此写了一个简单的猪UDF。这是:
dirs = LOAD '/var/location.txt' USING PigStorage();
results = FOREACH dirs GENERATE download_whole_folder_into_single_sequence_file($0);
/* I don't need results bag. It is just a dummy bag */
问题是我不确定每行输入是否在单独的映射器中处理。输入文件不是一个巨大的文件只有几百行。如果它是纯Map/Reduce
,那么我会使用NLineInputFormat
并在单独的Mapper
中处理每一行。我怎样才能在猪身上做同样的事情?
答案 0 :(得分:1)
Pig允许您编写自己的load functions,它允许您指定要使用的InputFormat。所以你可以写自己的。
那就是说,你所描述的工作听起来像是只涉及一个map-reduce步骤。由于在这种情况下使用Pig不会降低复杂性,并且您必须编写自定义代码才能使用Pig,我建议只使用vanilla map-reduce。如果文件总大小为千兆字节或更少,我只需在一台主机上直接完成。如果你不必使用map reduce,那就更简单了。
我通常使用map-reduce首先将数据加载到HDFS中,然后使用Pig进行所有数据处理。对于加载数据IMO,Pig并没有真正为vanilla hadoop添加任何好处,它只是一个包含InputFormat / RecordReader的包装器,需要实现其他方法。此外,在技术上可以使用Pig,您的装载机将被多次调用。这是一个问题,你不必担心直接使用Hadoop map-reduce。