2012-02-15 11 views
5

Tengo un problema al agregar números de fila usando Apache Pig. El problema es que tengo una columna STR_ID y quiero agregar una columna ROW_NUM para los datos en STR_ID, que es el número de fila de STR_ID.¿Cómo puedo agregar números de fila para filas en PIG o HIVE?

Por ejemplo, aquí es la entrada:

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

¿Cómo consigo la salida como:

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

respuestas usando cerdo o Colmena son aceptables. Gracias.

Respuesta

3

Facebook posted un número de UDF de subárbol que incluyen NumberRows. Dependiendo de su versión de colmena (creo que 0.8) puede que necesite agregar un atributo a la clase (stateful = true).

+0

¿En serio?¿Me puede dar un enlace donde pueda obtener el UDF? Puedo actualizar HIVE si es necesario, ¡muchas gracias por la ayuda! – Breakinen

+0

lo siento, no me he dado cuenta de que ya dio el enlace, gracias, ¡es útil! – Breakinen

1

Para la gente que se pregunta sobre Pig, encontré la mejor manera (actualmente) es escribir tu propia UDF. Quería agregar números de fila para tuplas en una bolsa. Este es el código para eso:

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

Este código es solo de referencia. Puede no ser a prueba de errores.

1

Esta es una buena respuesta para usted en mi ejemplo

Paso 1. Definir row_sequence() para procesar para el aumento automático de identificación

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

Paso 2. Insertar Steam ID & STR

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

Pig 0.11 introdujo RANK operator que se puede usar para este propósito.

+2

Sí, solo tendrá que '' ordenar por col, rand() '' si desea asegurarse de que se asignen diferentes números de fila a filas idénticas. – KalEl

1

Colmena -

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

O, si usted quiere tener filas ascendiendo por STR_ID -

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

esto no funcionó en Hive 1.2.1.2.3.4.7-4. ¿En qué versión estás usando esto? también, obtengo la referencia de superman en tu nombre. eso me hizo sentir bien para entender algo en desbordamiento de pila. – NiuBiBang

1

En Colmena:

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

En Colmena:

consulta

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

salida

3D64B18BC842  1 
BAECEFA8EFB6  2 
346B13E4E240  3 
6D8A9D0249B4  4 
9FD024AA52BA  5 
Cuestiones relacionadas