清管器&x2B;Hbase原子增量列值

清管器&x2B;Hbase原子增量列值,hbase,apache-pig,Hbase,Apache Pig,我试图将Hbase原子增量列读入Pig,并将其作为长值访问 但是,列值使用HBase十六进制结构:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 有人知道一种方法可以将Pig中的值转换为与get_计数器值1等价的值吗 我发布了一个使用UDF的解决方案: import java.io.IOException; import org.apache.pig.EvalFunc; import org.apache.pig.backend.executionengine.

我试图将Hbase原子增量列读入Pig,并将其作为长值访问

但是,列值使用HBase十六进制结构:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01

有人知道一种方法可以将Pig中的值转换为与get_计数器值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));
}
}
import java.io.IOException;
导入org.apache.pig.EvalFunc;
导入org.apache.pig.backend.executionengine.ExecuteException;
导入org.apache.pig.data.DataByteArray;
导入org.apache.pig.data.DataType;
导入org.apache.pig.data.Tuple;
导入org.apache.pig.impl.logicalayer.schema.schema;
公共级敞篷车扩展了EvalFunc{
@凌驾
公共长执行(元组输入)引发IOException{
if(input==null | | input.size()==0){
返回null;
}
试一试{
长值=0;
DataByteArray dba=(DataByteArray)input.get(0);
System.out.println(dba.toString());
字节[]ba=dba.get();
for(int i=0;ivalue=(value我从未使用过hbastorage,因此我不确定,但您可以尝试以下方法:

试着把它作为一个长句子来读:

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;

从HBase加载长整数不需要UDF。 您可以依赖HBasStorage上的
-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

第一个和第二个方法都转换为Pig空值。我将尝试编写一个可以实现这一点的UDF,但我以前从未使用过Pig UDF。哇!这是否有文档记录?这确实是一个非常有用的功能。谢谢!同样的命令可以用来存储计数器值吗?它似乎没有文档记录,我发现了这个在邮件列表中。我不知道它是否可以用于存储。它确实可以用于存储。我只是尝试了一个简单的示例,它将其转换回。即使没有caster=HBaseBinaryConverter,您也可以使用更简单的代码将字节数组解释为长:返回字节。toLong(ba);