Как я могу включить текущее имя файла ввода в мой скрипт Pig Latin? - PullRequest
13 голосов
/ 17 марта 2012

Я обрабатываю данные из набора файлов, которые содержат штамп даты как часть имени файла.Данные в файле не содержат отметку даты.Я хотел бы обработать имя файла и добавить его к одной из структур данных в сценарии.Есть ли способ сделать это в Pig Latin (возможно, в качестве расширения PigStorage?) Или мне нужно предварительно обработать все файлы с использованием Perl или чего-то подобного?

Я предполагаю что-то вроде следующего:

-- Load two fields from file, then generate a third from the filename
rawdata = LOAD '/directory/of/files/' USING PigStorage AS (field1:chararray, field2:int, field3:filename);

-- Reformat the filename into a datestamp
annotated = FOREACH rawdata GENERATE
  REGEX_EXTRACT(field3,'*-(20\d{6})-*',1) AS datestamp,
  field1, field2;

Обратите внимание на специальный тип данных "filename" в операторе LOAD.Похоже, это должно было произойти, поскольку после загрузки данных уже слишком поздно возвращаться к исходному имени файла.

Ответы [ 4 ]

14 голосов
/ 19 декабря 2012

Вы можете использовать PigStorage, указав -tagsource следующим образом

A = LOAD 'input' using PigStorage(',','-tagsource'); 
B = foreach A generate INPUT_FILE_NAME; 

Первое поле в каждом кортеже будет содержать входной путь (INPUT_FILE_NAME)

Согласно API doc http://pig.apache.org/docs/r0.10.0/api/org/apache/pig/builtin/PigStorage.html

Дан

13 голосов
/ 18 марта 2012

Pig wiki как пример PigStorageWithInputPath с именем файла в дополнительном поле chararray:

Пример

A = load '/directory/of/files/*' using PigStorageWithInputPath() 
    as (field1:chararray, field2:int, field3:chararray);

UDF

// Note that there are several versions of Path and FileSplit. These are intended:
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigSplit;
import org.apache.pig.builtin.PigStorage;
import org.apache.pig.data.Tuple;

public class PigStorageWithInputPath extends PigStorage {
   Path path = null;

   @Override
   public void prepareToRead(RecordReader reader, PigSplit split) {
       super.prepareToRead(reader, split);
       path = ((FileSplit)split.getWrappedSplit()).getPath();
   }

   @Override
   public Tuple getNext() throws IOException {
       Tuple myTuple = super.getNext();
       if (myTuple != null)
          myTuple.append(path.toString());
       return myTuple;
   }
}
3 голосов
/ 29 мая 2015

-tagSource устарел в Pig 0.12.0. Вместо этого используйте

-tagFile - добавляет имя входного исходного файла в начало каждого кортежа.
-tagPath - добавляет путь к исходному файлу в начале каждого кортежа.

A = LOAD '/user/myFile.TXT' using PigStorage(',','-tagPath'); 
DUMP A  ;

даст вам полный путь к файлу в первом столбце

( hdfs://myserver/user/blo/input/2015.TXT,439,43,05,4,NAVI,PO,P&C,P&CR,UC,40)

Ссылка: http://pig.apache.org/docs/r0.12.0/api/org/apache/pig/builtin/PigStorage.html

1 голос
/ 20 марта 2012

Способ сделать это в Bash и PigLatin можно найти по адресу: Как загрузить каждый файл в папке, используя PIG? .

Что я делал в последнее время, хотяи найти гораздо чище встраивание Pig в Python.Это позволяет вам бросать все виды переменных и тому подобное между ними.Простой пример:

#!/path/to/jython.jar                                    

# explicitly import Pig class                                                                         
from org.apache.pig.scripting import Pig

# COMPILE: compile method returns a Pig object that represents the pipeline                           
P = Pig.compile(
               "a = load '$in'; store a into '$out';")

input = '/path/to/some/file.txt'
output = '/path/to/some/output/on/hdfs'

# BIND and RUN                                                                                        
results = P.bind({'in':input, 'out':output}).runSingle()

if results.isSuccessful() :
    print 'Pig job succeeded'
else :
    raise 'Pig job failed'

Посмотрите на замечательные слайды Жюльена Ле Дема , если вам интересно.Там также тонна документации на http://pig.apache.org/docs/r0.9.2/cont.pdf.

...