Как добавить номера строк для строк в PIG или HIVE? - PullRequest
5 голосов
/ 15 февраля 2012

У меня проблема при добавлении номеров строк с использованием Apache Pig. Проблема в том, что у меня есть столбец STR_ID, и я хочу добавить столбец ROW_NUM для данных в STR_ID, который является номером строки STR_ID.

Например, вот входные данные:

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

Как получить вывод как:

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

Ответы с использованием Pig или Hive являются приемлемыми. Спасибо.

Ответы [ 8 ]

4 голосов
/ 23 июня 2017

В Улье:

Запрос

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

Выход

3D64B18BC842      1
BAECEFA8EFB6      2
346B13E4E240      3
6D8A9D0249B4      4
9FD024AA52BA      5
3 голосов
/ 15 февраля 2012

Facebook опубликовано количество UDF ульев, включая NumberRows. В зависимости от версии вашего улья (я считаю, что 0,8) вам может понадобиться добавить атрибут в класс (stateful = true).

2 голосов
/ 07 июня 2013

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

1 голос
/ 11 ноября 2016

В Улье:

select
str_id, ROW_NUMBER() OVER() as row_num 
from myTable;
1 голос
/ 15 января 2015

Решение улья -

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

Или, если вы хотите, чтобы строки проходили по STR_ID -

select *
  ,rank() over (STR_ID,rank()) as row_num
  from table
1 голос
/ 22 июля 2014

Начиная с версии 0.11, куст поддерживает аналитические функции, такие как опережение, отставание, а также номер строки

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

1 голос
/ 03 мая 2013

Это хороший ответ для вас на моем примере

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

INSERT OVERWRITE TABLE new_table
SELECT 
    row_sequence(),
    STR_ID
FROM old_table;
1 голос
/ 10 июля 2012

Для людей, интересующихся Pig, я нашел лучший способ (в настоящее время) написать свой собственный 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;
     }
    }
}

Этот код только для справки. Может быть не защищен от ошибок.

...