Pig + Hbase 原子增量列值

Posted

技术标签:

【中文标题】Pig + Hbase 原子增量列值【英文标题】:Pig + Hbase Atomic Increment Column Values 【发布时间】:2012-03-06 14:45:15 【问题描述】:

我正在尝试将 Hbase 原子增量列读入 Pig 并作为 Long 值访问它。

但是,列值使用 Hbases Hex 结构:\x00\x00\x00\x00\x00\x00\x00\x01

有谁知道在 Pig 中将其转换为与 get_counter 值等效的方法:1

我已经发布了一个使用 UDF 的解决方案:

import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.data.DataByteArray;
import org.apache.pig.data.DataType;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.schema.Schema;


public class ConvertToLong extends EvalFunc<Long> 

@Override
public Long exec(Tuple input) throws IOException 

    if (input == null || input.size() == 0) 
        return null;
    

    try 

        long value = 0;
        DataByteArray dba = (DataByteArray)input.get(0);
        System.out.println( dba.toString() );
        byte[] ba = dba.get();

        for (int i = 0; i < ba.length; i++)
        
            value = (value << 8) + (ba[i] & 0xff);
        
        return value;
        //return value;
     catch (ExecException e) 
        log.warn("Error reading input: " + e.getMessage());
        return 3L;
     catch( Exception e )
        log.warn("Error:" + e.getMessage() );
        return 2L;
    


@Override
public Schema outputSchema(Schema input) 
    return new Schema(new Schema.FieldSchema(null, DataType.LONG));


【问题讨论】:

即使没有 caster=HBaseBinaryConverter,您也可以使用更简单的代码将字节数组解释为 long:return Bytes.toLong(ba); 【参考方案1】:

从 HBase 加载长整数不需要 UDF。 您可以依赖 HBaseStorage 上的 -caster=HBaseBinaryConverter 选项。

示例: 我有一个名为 counters 的表,该值存储在 val:val 列下(使用将数据存储为 8 个字节长的增量功能)。 列出 PIG 中的所有计数器:

counters = LOAD 'hbase://counters' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('val:val', '-caster=HBaseBinaryConverter -loadKey') AS (key:chararray, val:long);
DUMP counters

【讨论】:

哇!这甚至记录在某处吗?可以肯定的是,这是一个非常有用的功能。谢谢你!另外,同样的命令可以用来存储计数器值吗? 似乎没有记录,我在邮件列表中找到了这个。不知道能不能用来收纳。 它确实适用于存储。我刚刚尝试了一个简单的示例,它会将其转换回来。【参考方案2】:

我没用过HBaseStorage所以不太确定,但是你可以试试下面的方法:

试着读长一点:

data = LOAD 'your/path' USING HBaseStorage(...) AS (x:long);

如果这不起作用,试试这个:

data = LOAD 'your/path' USING HBaseStorage(...)
data = FOREACH data GENERATE (long) $1 AS x;

否则,您始终可以编写一个 UDF 来进行转换:

data = LOAD 'your/path' USING HBaseStorage(...);
data = FOREACH data GENERATE ConvertToLong($1) as x;

【讨论】:

第一种和第二种方法都转换为 Pig 空值。我会尝试编写一个可以实现这一点的 UDF,但我以前从未使用过 Pig UDF。

以上是关于Pig + Hbase 原子增量列值的主要内容,如果未能解决你的问题,请参考以下文章

在脚本mysql中重置自动增量列值

Apache Spark - 根据列值添加增量 ID

选择语句中的 SQL 增量列值

在 INSERT SELECT 语句期间生成增量数值列值

HBase 模式行键设计 - 增量计数器?

实体框架的原子增量