2012-02-15 36 views
5

使用Apache Pig添加行號時出現問題。 問題是我有一個STR_ID列,我想爲STR_ID中的數據添加一個ROW_NUM列,這是STR_ID的行號。如何在PIG或HIVE中添加行號?

例如,這裏是輸入:

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

如何得到這樣的輸出:用豬或蜂巢是可以接受的

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

答案。謝謝。

回答

3

Facebook posted許多配置單元UDF包括NumberRows。根據您的配置單元版本(我相信0.8),您可能需要向類中添加一個屬性(stateful = true)。

+0

哦,真的?你能給我一個鏈接,我可以得到UDF嗎?如有必要,我可以升級HIVE,非常感謝您的幫助! – Breakinen 2012-02-16 14:22:53

+0

對不起,我沒有注意到你已經給了鏈接,謝謝,這是有幫助的! – Breakinen 2012-02-16 14:35:02

1

對於想知道豬的人們,我發現最好的方式(當前)是編寫自己的UDF。 我想爲行李中的元組添加行號。這是代碼爲:

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()函數來自動增加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'; 

步驟2.將唯一的ID & STR

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

豬0.11引入了RANK operator可用於此目的。

+2

是的 - 如果你想確保不同的行號分配給相同的行,你只需要按col,rand()命令''。 – KalEl 2015-01-15 19:01:53

1

蜂巢解決方案 -

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

或者,如果你想有行由STR_ID升序 -

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

這在Hive 1.2.1.2.3.4.7-4中不起作用。你用什麼版本?另外,我以你的名義得到超人蔘考。這讓我感覺很好,可以真正理解堆棧溢出的問題。 – NiuBiBang 2016-04-22 18:21:23

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