apache pig—使用pig脚本从hbase加载数据,而不知道字段的数量

ep6jt1vc  于 2021-06-24  发布在  Pig
关注(0)|答案(3)|浏览(370)

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

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

gcxthw6b

gcxthw6b1#

为了处理pig中的数据,您需要知道数据的模式。这不是最优雅的解决方案,但是因为您知道您不会有超过25个字段,所以比找到问题的优雅解决方案更快的方法是一次性键入所有25个字段,将它们放入一个元组中,然后继续。

ctrmrzij

ctrmrzij2#

我也遇到了同样的问题。解决方法如下:如果知道列族名称,可以使用以下方法将属于某个列族的所有列从hbase加载到pig中。基本上可以归结为将所有列(使用*)放在Map中:

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

cygmwpex3#

现在回答这个问题有点晚了,但它值得分享的知识,以美丽的开发谁总是相信stackoverflow的世界@sandervandenoord的答案非常适合从hbase表加载数据。
要对数据进行进一步的操作,您应该需要更多的技术。一个名为pigitos的自定义udfjar提供了一些有用的函数。你可以从这里下载。
下面是代码片段。

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行只是一个关于如何使用 MapEntriesTpBag 来自自定义项的函数。您可以使用该链接中描述的可用函数执行更多操作。
非常感谢亚当·卡瓦http://hakunamapdata.com

相关问题