在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);
但正如我之前所说,它不令人满意,因为我只能加载固定数量的列。
有什么想法吗?
答案 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个字段,把它们放在一个元组中,继续前进。