2

在 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);

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

任何想法?

4

3 回答 3

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[])
; 
于 2015-06-26T08:09:22.587 回答
0

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

要对数据进行进一步的操作,您应该需要更多的技术。一个名为 Pigitos 的自定义 udf jar 提供了一些有用的功能。你可以从这里下载。

这是代码片段。

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 行只是说明如何使用MapEntriesTpBagUDF 中的函数的示例。您可以使用该链接中描述的可用功能执行更多操作。

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

于 2018-02-26T18:13:49.163 回答
-3

为了在 Pig 中使用数据,您需要了解数据的架构。这不是最优雅的解决方案,但由于您知道您不会有超过 25 个字段,因此比找到问题的优雅解决方案更快的是只需一次输入所有 25 个字段,将它们放在一个元组中,然后然后继续。

于 2013-08-13T13:01:39.930 回答