2012-03-06 6 views
3

Я пытаюсь читать в столбце атомарного инкремента Hbase в Pig и иметь доступ к нему как длинное значение.Pig + Hbase Atomic Increment Column Values ​​

Однако значение столбца использует Hbases Hex как структура: \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x01

Кто-нибудь знает метод, чтобы преобразовать его в Pig стать equivilant в значение 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

Даже без МНЛЗЛО = HBaseBinaryConverter, вы могли бы использовать более простой код для интерпретации массива байт как долго: возвращение Bytes.toLong (ба); –

ответ

7

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

Пример: У меня есть таблица с именем counters, значение хранится в столбце val: val (с использованием функции increment, которая хранит данные длиной 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

Wow! Это даже где-то документировано? Очень полезная функция. Спасибо за это!! Кроме того, может ли эта же команда работать для хранения значения счетчика? –

+0

Это не похоже на документацию, я нашел это в списках рассылки. Я не знаю, можно ли его использовать для хранения. –

+0

Он работает для хранения. Я просто попробовал простой пример, и он преобразует его обратно. –

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; 

В противном случае, вы всегда можете написать пользовательскую функцию, которая будет делать преобразование:

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

Первый и второй методы, приведённые к нулевым значениям Pig. Я попробую написать UDF, который может это сделать, но я никогда раньше не работал с Pig UDF. –

+0

Я обновил вопрос, чтобы включить решение с использованием UDF –