有没有办法在Pig Script中创建索引?

时间:2015-02-18 17:37:18

标签: hadoop indexing hbase apache-pig

我有一个没有id号(索引)的数据文件。可以使用UDF或猪中的任何内置函数创建每个条目的索引吗?例如:

data = load 'myfile.txt' using PigStorge(',') AS ( speed:float, location:charrarray);
A = foreach data generate index as (Id:int), speed, location;

我在将数据从pig加载到Hbase时遇到问题,因为hbase将速度读取为行键值,并且我的文件中存在许多重复数据(速度)。我想将index设置为行键值并存储在Hbase表中。你有什么建议吗?谢谢。

3 个答案:

答案 0 :(得分:3)

从根本上说,在分布式计算中添加像ID这样的增加计数真的很难。问题是每个拆分需要知道它前面有多少个数字才能继续计数。所以,我不建议采用这种方法。

您可以编写生成Java UUID的UDF,也可以使用RANDOM生成随机数。例如:

data = load 'myfile.txt' using PigStorge(',') AS ( speed:float, location:charrarray);
A = foreach data generate RANDOM() as id, speed, location;

一些未经请求的建议:您需要考虑一下为什么要使用HBase一秒钟。使用键值存储的全部意义在于您可以按键查找事物。如果您只是使用任意ID将其插入HBase,您将如何查找它?如果您只是计划进行全表扫描,那么您应该只使用HDFS。

您会对数据提出哪些问题?如果您按地点进行操作,则可以将您的位置作为密钥的一部分,并将事件放在行中。

答案 1 :(得分:2)

Pig 0.14版本支持内置函数UniqueID。它将以" taskindex-sequence"的形式为每条记录返回唯一的id字符串。

A = foreach data generate UniqueID() as id, speed, location;

http://pig.apache.org/docs/r0.14.0/func.html#uniqueid

答案 2 :(得分:-1)

这可以通过使用以下python UDF来解决:

import random 
from datetime import datetime as dt

def currTime():
    x =dt.now()
    return x.microsecond+  int(random.random()*100)+x.second*1000000 

在每个步骤中,它都会生成唯一编号,并使用此编号作为索引。仍然有可能在不同的条目中具有相同的索引,但它太小,可能小于(0.01%)并且取决于每个单位步骤的计算机的处理时间。