2012-02-15 4 views
5

У меня проблема при добавлении номеров строк с помощью Apache Pig. Проблема в том, что у меня есть столбец STR_ID, и я хочу добавить столбец ROW_NUM для данных в STR_ID, который является номером строки 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 

ответы с помощью Pig или Улей являются приемлемыми. Спасибо.

ответ

3

Facebook posted Число UUF в улье, включая NumberRows. В зависимости от вашей версии улья (я считаю, 0.8) вам может потребоваться добавить атрибут к классу (stateful = true).

+0

О действительно?можете ли вы дать мне ссылку, где я могу получить UDF? Я могу при необходимости обновить ВИЧ, большое спасибо за помощь! – Breakinen

+0

жаль, что я не заметил, что вы уже дали ссылку, спасибо, это полезно! – Breakinen

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. Вставьте уникальный идентификатор & STR

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

Свинья 0.11 добавлена ​​RANK operator, который может быть использован для этой цели.

+2

Да - вам просто нужно «упорядочить командой col, rand()», если вы хотите, чтобы разные номера строк были присвоены одинаковым строкам. – KalEl

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^