2012-03-06 85 views
3

我正在嘗試將Hbase原子增量列讀入Pig中,並以Long值的形式訪問它。Pig + Hbase原子增量列值

但是,列值使用Hbases六角狀結構:\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X01

有誰知道的方法來轉換,在豬成爲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(BA); – 2013-04-12 15:06:01

回答

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 
+0

哇!這是甚至記錄在某個地方?一個非常有用的功能是肯定的。感謝這!此外,這個相同的命令可以存儲計數器值嗎? – 2012-04-20 19:08:22

+0

它似乎沒有記錄,我發現這在郵件列表中。我不知道它是否可以用於存儲。 – 2012-05-03 09:55:39

+0

它可以存儲。我只是嘗試了一個簡單的例子,並將其轉換回來。 – 2012-05-11 16:50:58

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; 
+0

第一個和第二個方法都轉換爲Pig空值。我會嘗試編寫一個能夠實現這一目標的UDF,但我從未與Pig UDF合作過。 – 2012-03-06 19:06:18

+0

我更新了問題以包含使用UDF的解決方案 – 2012-03-06 21:09:34