2012-02-15 26 views
5

Tôi gặp sự cố khi thêm số hàng bằng cách sử dụng Apache Pig. Vấn đề là tôi có cột STR_ID và tôi muốn thêm cột ROW_NUM cho dữ liệu trong STR_ID, là số hàng của STR_ID.Làm cách nào để thêm số hàng cho các hàng trong PIG hoặc HIVE?

Ví dụ, đây là đầu vào:

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

Làm thế nào để có được sản lượng như:

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

Answers sử dụng Pig hoặc Hive được chấp nhận. Cảm ơn bạn.

Trả lời

3

Facebook posted một số UDF bao gồm NumberRows. Tùy thuộc vào phiên bản hive của bạn (tôi tin rằng 0.8) bạn có thể cần phải thêm một thuộc tính vào lớp (stateful = true).

+0

Oh thật sao?bạn có thể cho tôi một liên kết để tôi có thể lấy UDF không? Tôi có thể nâng cấp HIVE nếu cần thiết, cảm ơn bạn rất nhiều vì đã giúp đỡ! – Breakinen

+0

xin lỗi tôi đã không nhận thấy rằng bạn đã cung cấp liên kết, cảm ơn bạn, nó rất hữu ích! – Breakinen

1

Đối với những người tự hỏi về Pig, tôi đã tìm ra cách tốt nhất (hiện tại) là viết UDF của riêng bạn. Tôi muốn thêm số hàng cho các bộ trong túi. Đây là mã cho điều đó:

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

Mã này chỉ để tham khảo. Có thể không có lỗi.

1

Đây là câu trả lời tốt cho bạn trên ví dụ của tôi

Bước 1. Xác định row_sequence() chức năng để xử lý đối với ô tô tăng ID

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

Bước 2. Chèn độc đáo id & STR

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

Pig 0.11 giới thiệu RANK operator có thể được sử dụng cho mục đích này.

+2

Có - bạn sẽ chỉ cần '' sắp xếp theo col, rand() '' nếu bạn muốn đảm bảo các số hàng khác nhau được gán cho các hàng giống hệt nhau. – KalEl

1

Hive -

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

Hoặc, nếu bạn muốn có hàng tăng dần bởi STR_ID -

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

tính năng này không hoạt động trong Hive 1.2.1.2.3.4.7-4. bạn đang sử dụng phiên bản này? Ngoài ra, tôi có được tài liệu tham khảo siêu nhân trong tên của bạn. điều đó làm tôi cảm thấy tốt khi thực sự hiểu điều gì đó trên tràn ngăn xếp. – NiuBiBang

1

Trong Hive:

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

Trong Hive:

Query

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

Output

3D64B18BC842  1 
BAECEFA8EFB6  2 
346B13E4E240  3 
6D8A9D0249B4  4 
9FD024AA52BA  5 
Các vấn đề liên quan