2012-02-15 12 views
5

अपाचे पिग का उपयोग करते हुए पंक्ति संख्या जोड़ते समय मुझे कोई समस्या है। समस्या यह है कि मेरे पास एक STR_ID कॉलम है और मैं STR_ID में डेटा के लिए ROW_NUM कॉलम जोड़ना चाहता हूं, जो STR_ID की पंक्ति संख्या है।मैं पीआईजी या HIVE में पंक्तियों के लिए पंक्ति संख्या कैसे जोड़ सकता हूं?

STR_ID 
------------ 
3D64B18BC842 
BAECEFA8EFB6 
346B13E4E240 
6D8A9D0249B4 
9FD024AA52BA 

मैं की तरह उत्पादन कैसे मिलता है:

STR_ID | ROW_NUM 
---------------------------- 
3D64B18BC842 |  1 
BAECEFA8EFB6 |  2 
346B13E4E240 |  3 
6D8A9D0249B4 |  4 
9FD024AA52BA |  5 

का उपयोग कर सुअर या हाइव स्वीकार्य हैं जवाब

उदाहरण के लिए, यहाँ इनपुट है। धन्यवाद।

उत्तर

3

फेसबुक posted नंबररो सहित कई हाइव यूडीएफ शामिल हैं। आपके हाइव संस्करण (मुझे विश्वास है 0.8) के आधार पर आपको कक्षा (राज्य = सही) में एक विशेषता जोड़ने की आवश्यकता हो सकती है।

+0

ओह सच में?क्या आप मुझे एक लिंक दे सकते हैं जहां मैं यूडीएफ प्राप्त कर सकता हूं? यदि आवश्यक हो तो मैं HIVE को अपग्रेड कर सकता हूं, सहायता के लिए बहुत बहुत धन्यवाद! – Breakinen

+0

क्षमा करें मैंने नहीं देखा है कि आपने पहले ही लिंक दिया है, धन्यवाद, यह सहायक है! – Breakinen

1

पिग के बारे में सोचने वाले लोगों के लिए, मुझे सबसे अच्छा तरीका मिला (वर्तमान में) अपना यूडीएफ लिखना है। मैं बैग में टुपल्स के लिए पंक्ति संख्या जोड़ना चाहता था। यह उसके लिए कोड है:

import java.io.IOException; 
import java.util.Iterator; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.backend.executionengine.ExecException; 
import org.apache.pig.data.BagFactory; 
import org.apache.pig.data.DataBag; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.TupleFactory; 
import org.apache.pig.impl.logicalLayer.schema.Schema; 
import org.apache.pig.data.DataType; 

public class RowCounter extends EvalFunc<DataBag> { 
TupleFactory mTupleFactory = TupleFactory.getInstance(); 
BagFactory mBagFactory = BagFactory.getInstance(); 
public DataBag exec(Tuple input) throws IOException { 
    try { 
     DataBag output = mBagFactory.newDefaultBag(); 
     DataBag bg = (DataBag)input.get(0); 
     Iterator it = bg.iterator(); 
     Integer count = new Integer(1); 
     while(it.hasNext()) 
      { Tuple t = (Tuple)it.next(); 
       t.append(count); 
       output.add(t); 
       count = count + 1; 
      } 

     return output; 
    } catch (ExecException ee) { 
     // error handling goes here 
     throw ee; 
    } 
} 
public Schema outputSchema(Schema input) { 
    try{ 
     Schema bagSchema = new Schema(); 
     bagSchema.add(new Schema.FieldSchema(null, DataType.BAG)); 

     return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), 
               bagSchema, DataType.BAG)); 
    }catch (Exception e){ 
     return null; 
    } 
    } 
} 

यह कोड केवल संदर्भ के लिए है। त्रुटि-सबूत नहीं हो सकता है।

1

यह मेरा उदाहरण पर आप के लिए अच्छा जवाब

चरण 1. ऑटो वृद्धि आईडी के लिए कार्रवाई करने के लिए row_sequence() फंक्शन को परिभाषित करें

add jar /Users/trongtran/research/hadoop/dev/hive-0.9.0-bin/lib/hive-contrib-0.9.0.jar; 
drop temporary function row_sequence; 
create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'; 

चरण 2. सम्मिलित विशिष्ट आईडी & एसटीआर है

INSERT OVERWRITE TABLE new_table 
SELECT 
    row_sequence(), 
    STR_ID 
FROM old_table; 
2

पिग 0.11 नेपेश कियाजिसका उपयोग इस उद्देश्य के लिए किया जा सकता है।

+2

हां - आपको केवल कॉल, रैंड() '' के आदेश की आवश्यकता होगी, यदि आप यह सुनिश्चित करना चाहते हैं कि अलग-अलग पंक्तियों को अलग-अलग पंक्तियों को असाइन किया गया हो। – KalEl

1

संस्करण 0.11 से, छत्ता सीसा जैसे विश्लेषणात्मक कार्यों का समर्थन करता है, अंतराल और भी संख्या

https://issues.apache.org/jira/browse/HIVE-896

1

हाइव समाधान पंक्ति -

select * 
    ,rank() over (rand()) as row_num 
    from table 

या, यदि आप पंक्तियों करना चाहते हैं STR_ID द्वारा आरोही -

select * 
    ,rank() over (STR_ID,rank()) as row_num 
    from table 
+0

यह हाइव 1.2.1.2.3.4.7-4 में काम नहीं किया। आप इसका किस संस्करण का उपयोग कर रहे हैं? भी, मुझे आपके नाम पर सुपरमैन संदर्भ मिलता है। जिसने मुझे वास्तव में ढेर अतिप्रवाह पर कुछ समझने के लिए अच्छा महसूस किया। – NiuBiBang

1

हाइव में:

select 
str_id, ROW_NUMBER() OVER() as row_num 
from myTable; 
4

हाइव में:

क्वेरी

select str_id,row_number() over() from tabledata; 

आउटपुट

3D64B18BC842  1 
BAECEFA8EFB6  2 
346B13E4E240  3 
6D8A9D0249B4  4 
9FD024AA52BA  5 
संबंधित मुद्दे

 संबंधित मुद्दे