使用Pig脚本从Hbase加载数据,而不知道字段数

时间:2013-08-13 08:31:36

标签: hbase apache-pig

在Hbase中,每行都有列:

u1:chararray, u2:chararray, ..., un:chararray

在名为u的列族中(来自utable) 每行的数字n可以不同。我想在元组中加载所有这些列,而不是全部命名(例如使用*字符),但我真的不知道如何这样做。

目前我使用以下行创建元组:

qoe1 = LOAD 'hbase://utable'
       USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('u:u1, u:u2, u:u3', '-loadKey true')
       AS (ID:chararray, u1:chararray, u2:chararray, u3:chararray);

但正如我之前所说,它不令人满意,因为我只能加载固定数量的列。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。解决了以下问题:如果您知道列族名称,则可以使用以下方法将属于HBase列族的所有列加载到Pig中。 基本上它归结为将所有列(使用*)放在地图中:

result = LOAD    'hbase://your_table_name'
         USING   org.apache.pig.backend.hadoop.hbase.HBaseStorage('u:*', '-loadKey true') 
         AS      (id:bytearray, u:map[])
; 

答案 1 :(得分:0)

回答这个问题为时已晚,但它值得向那些始终相信StackOverflow的美丽开发者分享知识。 @Sander van den Oord的答案非常适合从HBase表加载数据。

要对数据进行进一步操作,您需要更多技巧。一个名为Pigitos的自定义udf jar有一些有用的功能。您可以从here下载。

以下是代码段。

register hdfs:///hdfs/location/of/Pigitos-1.0.jar
DEFINE MapEntriesToBag pl.ceon.research.pigitos.pig.udf.MapEntriesToBag();
hbasedata = LOAD 'hbase://utable' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('u:*', '-loadKey true') AS (row:chararray, u:map[]);
extract = foreach hbasedata generate flatten(SUBSTRING($0,3,12)) as key, flatten(MapEntriesToBag($1)) as product;
dump extract ;

上面代码的第4行只是一个如何使用UDF中的MapEntriesTpBag函数的示例。您可以使用该链接中描述的可用功能执行更多操作。

非常感谢来自http://hakunamapdata.com

的Adam Kava

答案 2 :(得分:-3)

为了处理Pig中的数据,您需要知道数据的架构。这不是最优雅的解决方案,但是因为你知道你不会超过25个字段,比找到一个优雅的问题解决方案更快,只需要一次输出所有25个字段,把它们放在一个元组中,继续前进。