如何为pig或hive中的行添加行号?

snvhrwxg  于 2021-06-21  发布在  Pig
关注(0)|答案(8)|浏览(393)

我在使用apachepig添加行号时遇到了一个问题。问题是我有一个str\u id列,我想为str\u id中的数据添加一个row\u num列,它是str\u id的行号。
例如,以下是输入:

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

如何获得如下输出:

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

使用Pig或Hive的答案是可以接受的。谢谢您。

gpnt7bae

gpnt7bae1#

对于那些想了解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;
     }
    }
}

此代码仅供参考。可能不是防错的。

bd1hkmkf

bd1hkmkf2#

facebook发布了包括numberrows在内的许多hive自定义项。根据您的配置单元版本(我相信是0.8),您可能需要向类添加一个属性(stateful=true)。

r7xajy2e

r7xajy2e3#

Hive溶液-

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

或者,如果您想让行按str\u id升序-

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

dvtswwa34#

从版本0.11开始,hive支持lead、lag和row number等分析函数
https://issues.apache.org/jira/browse/hive-896

6yt4nkrj

6yt4nkrj5#

就我的例子来说,这是一个很好的答案
第一步。define row\ u 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';

第二步。插入唯一id字符串(&S)

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

gzszwxb46#

pig0.11引入了一个秩运算符,可用于此目的。

pgky5nke

pgky5nke7#

在Hive中:
查询

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

输出

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

2w3kk1z58#

在Hive中:

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

相关问题