我正在尝试将Hbase原子增量列读入Pig并以Long值访问它。
但是,列值使用Hbases十六进制结构:\ 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));
}
}
答案 0 :(得分:7)
您不需要UDF从HBase加载长整数。
您可以依赖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
答案 1 :(得分:0)
我从未使用过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;