2012-03-17 5 views
13

मैं फ़ाइलों के एक सेट से डेटा प्रोसेस कर रहा हूं जिसमें फ़ाइल नाम के हिस्से के रूप में दिनांक टिकट शामिल है। फ़ाइल के भीतर डेटा में दिनांक टिकट नहीं है। मैं फ़ाइल नाम को संसाधित करना चाहता हूं और इसे स्क्रिप्ट के भीतर डेटा संरचनाओं में से एक में जोड़ना चाहता हूं। क्या पिग लैटिन (शायद पिगस्टॉरेज के लिए एक विस्तार?) के भीतर ऐसा करने का कोई तरीका है या क्या मुझे पर्ल या पहले की तरह सभी फ़ाइलों को प्रीप्रोसेस करने की ज़रूरत है?मैं अपने पिग लैटिन स्क्रिप्ट में वर्तमान इनपुट फ़ाइल नाम कैसे शामिल कर सकता हूं?

-- 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; 

नोट लोड बयान में विशेष "फ़ाइल नाम" डेटाप्रकार:

मैं निम्नलिखित की तरह कुछ कल्पना। ऐसा लगता है कि डेटा लोड होने के बाद इसे वहां होना होगा, स्रोत फ़ाइल नाम पर वापस जाने में बहुत देर हो चुकी है।

उत्तर

13

PigStorageWithInputPath जो एक अतिरिक्त chararray क्षेत्र में फ़ाइल नाम था का एक उदाहरण के रूप में सुअर विकि:

उदाहरण

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

एक तरह से बैश में यह करने के लिए यूडीएफ

// 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; 
    } 
} 
1

और पिगलाटिन पर पाया जा सकता है: How Can I Load Every File In a Folder Using PIG?

हालांकि मैं हाल ही में क्या कर रहा हूं, और पाइथन में सुअर को एम्बेड करने के लिए बहुत साफ है। चलो आप सभी प्रकार के चर और जैसे दोनों के बीच फेंक देते हैं। एक साधारण उदाहरण है:

#!/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' 

, इस के लिए एक परिचय के रूप Julien Le Dem's great slides पर एक नज़र डालें यदि आप रुचि रखते हैं। http://pig.apache.org/docs/r0.9.2/cont.pdf पर दस्तावेज़ों का एक टन भी है।

14

आप द्वारा PigStorage उपयोग कर सकते हैं -tagsource निम्नलिखित के रूप में निर्दिष्ट

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

प्रत्येक टपल इनपुट पथ (INPUT_FILE_NAME)

शामिल होंगे एपीआई दस्तावेज़ के अनुसार http://pig.apache.org/docs/r0.10.0/api/org/apache/pig/builtin/PigStorage.html

दान

में पहला फ़ील्ड
3

-टैगसोर्स को पिग 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) 

Refrence: http://pig.apache.org/docs/r0.12.0/api/org/apache/pig/builtin/PigStorage.html