Значения столбцов атомарного приращения Pig + Hbase - PullRequest
3 голосов
/ 06 марта 2012

Я пытаюсь прочитать в столбце атомарного приращения 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));
}
}

Ответы [ 2 ]

7 голосов
/ 28 марта 2012

Вам не нужен UDF для загрузки длинных целых чисел из HBase. Вы можете положиться на опцию -caster=HBaseBinaryConverter в HBaseStorage.

Пример: У меня есть таблица с именем 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
0 голосов
/ 06 марта 2012

Я никогда не использовал 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;
...