使用pig为hbase中的列族添加可变数量的列

knpiaxh1  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(307)

我需要使用hbastorage从pig加载到hbase,但我不知道如何使用特定列族的可变列数进行加载
如下所示的数据:(为便于阅读而添加空格)

Id,ItemId,Count,Date
1 ,1     ,2    ,2015-02-01
2 ,2     ,2    ,2015-02-02
3 ,1     ,2    ,2015-02-03

我有一个带有rowkey的hbase表和一个名为attributes的列族。因此,我首先使用以下方法加载csv:

A = LOAD 'items.csv' USING PigStorage(',') 
as (Id,ItemId,Count:chararray, CreationDate:chararray);

现在我要按itemid对它们进行分组,所以我要执行以下操作:

B = FOREACH A GENERATE ItemId, TOTUPLE(Date, Count);

C = GROUP B BY ItemId

所以我把我的数据很好地分组,用键,然后是元组和日期和计数:

1   {(2015-02-03, 2),(2015-02-01, 2)}
2   {(2015-02-02, 2)}

我在hbase中的目标是一行两列,带日期和计数:

Rowkey = 1 (Attributes.2015-02-03,2) (Attributes.2015-02-01,2)
Rowkey = 2 (Attributes.2015-02-02,2)

这是我正在努力解决的问题,我如何定义我有一个可变的列数?我尝试了以下方法以及多种其他组合:

STORE onlygroups into 'hbase://mytable'
USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('Attributes:*');

但有几个错误,例如:

ERROR 2999: Unexpected internal error. org.apache.pig.data.InternalCachedBag 
    cannot be cast to java.util.Map

我也尝试过使用tomap,但也不起作用。有什么建议吗?
注意:被标识为duplicate的推荐解决方案并不能解决我的问题,它基本上建议使用mapreduce,并且我的数据结构不同。

pexxcrt2

pexxcrt21#

为了将数据加载到hbase,pig中的数据应采用以下格式:

tuple(key, map(col_qual, col_value))

就你而言:

(1,[2015-02-03#2])
(1,[2015-02-01#2])
(2,[2015-02-02#2])

您可以直接从初始数据创建此类型的对象:

A = LOAD 'items.csv' USING PigStorage(',') as (Id,ItemId,Count:chararray,CreationDate:chararray);
storeHbase = FOREACH A GENERATE ItemId, TOMAP(CreationDate, Count);

或者如果您想在按键分组后实现它:

B = FOREACH A GENERATE ItemId, TOTUPLE(CreationDate, Count) as pair;
C = GROUP B BY ItemId;
storeHbase = FOREACH C {
    Tmp = FOREACH $1 GENERATE TOMAP(pair.CreationDate,pair.Count);
    GENERATE group, FLATTEN(Tmp);
};

毕竟,您可以将数据加载到hbase:

STORE storeHbase into 'hbase://mytable' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('Attributes:*');

哪里 mytable 是您的hbase表和 Attributes 是你的家人。

相关问题