Hadoop 如何为PIG或HIVE中的行添加行号?

Hadoop 如何为PIG或HIVE中的行添加行号?,hadoop,hive,apache-pig,Hadoop,Hive,Apache Pig,我在使用ApachePig添加行号时遇到问题。 问题是我有一个STR_ID列,我想为STR_ID中的数据添加一个ROW_NUM列,这是STR_ID的行号 例如,以下是输入: STR_ID ------------ 3D64B18BC842 BAECEFA8EFB6 346B13E4E240 6D8A9D0249B4 9FD024AA52BA 如何获得如下输出: STR_ID | ROW_NUM ---------------------------- 3D64B18BC842

我在使用ApachePig添加行号时遇到问题。 问题是我有一个STR_ID列,我想为STR_ID中的数据添加一个ROW_NUM列,这是STR_ID的行号

例如,以下是输入:

STR_ID
------------
3D64B18BC842
BAECEFA8EFB6
346B13E4E240
6D8A9D0249B4
9FD024AA52BA
如何获得如下输出:

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

使用猪或蜂箱回答是可以接受的。谢谢。

Facebook提供了包括NumberRows在内的许多hive UDF。根据您的配置单元版本(我相信是0.8),您可能需要为类添加一个属性(stateful=true)。

对于那些想了解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;
     }
    }
}
import java.io.IOException;
导入java.util.Iterator;
导入org.apache.pig.EvalFunc;
导入org.apache.pig.backend.executionengine.ExecuteException;
导入org.apache.pig.data.BagFactory;
导入org.apache.pig.data.DataBag;
导入org.apache.pig.data.Tuple;
导入org.apache.pig.data.TupleFactory;
导入org.apache.pig.impl.logicalayer.schema.schema;
导入org.apache.pig.data.DataType;
公共类行计数器扩展EvalFunc{
TupleFactory mTupleFactory=TupleFactory.getInstance();
BagFactory mBagFactory=BagFactory.getInstance();
公共数据包exec(元组输入)引发IOException{
试一试{
数据包输出=mBagFactory.newDefaultBag();
DataBag bg=(DataBag)input.get(0);
迭代器it=bg.Iterator();
整数计数=新整数(1);
while(it.hasNext())
{Tuple t=(Tuple)it.next();
t、 追加(计数);
输出。添加(t);
计数=计数+1;
}
返回输出;
}捕获(被执行者){
//错误处理在这里进行
投掷物;
}
}
公共模式输出模式(模式输入){
试一试{
模式bagSchema=新模式();
add(newschema.FieldSchema(null,DataType.BAG));
返回新模式(new Schema.FieldSchema(getSchemaName)(this.getClass().getName().toLowerCase(),input),
bagSchema,DataType.BAG));
}捕获(例外e){
返回null;
}
}
}

此代码仅供参考。可能不会出错。

对于我的示例,这是一个很好的答案

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

Pig 0.11引入了一种可用于此目的的分析功能。

从0.11版开始,hive支持超前、滞后和行号等分析功能

蜂箱溶液-

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

或者,如果您想让行按STR_ID升序-

select *
  ,rank() over (STR_ID,rank()) as row_num
  from table
在蜂箱中:

select
str_id, ROW_NUMBER() OVER() as row_num 
from myTable;
在蜂箱中:

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

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

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

哦,真的吗?你能给我一个链接,在那里我可以得到UDF吗?如果需要,我可以升级蜂箱,非常感谢您的帮助!对不起,我没有注意到你已经给了链接,谢谢,这很有帮助!是-如果要确保为相同的行分配不同的行号,只需按列排序()。这在配置单元1.2.1.2.3.4.7-4中不起作用。你在哪个版本上使用这个?还有,我以你的名义得到了超人的证明。这让我感觉很好,因为我真正理解了堆栈溢出的一些内容。