Добавить переменное количество столбцов для семейства столбцов в HBase с помощью Pig

Мне нужно загрузить из Pig в HBase с помощью HBaseStorage, и я не могу понять, как загрузить с переменным количеством столбцов для определенного семейства столбцов (с известным количеством столбцов это просто)

Данные, которые выглядят следующим образом: (для удобства чтения пробелы добавлены)

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

И у меня есть таблица HBase с ключом строки и одним семейством столбцов под названием Атрибуты. Итак, я сначала загружаю 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

Итак, я получаю свои данные хорошо сгруппированными, с ключом, а затем кортежи с Date и Count:

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, но тоже не работает. Какие-либо предложения?

Примечание: рекомендуемое решение, обозначенное как дубликат, не решает мою проблему, оно в основном рекомендует использовать MapReduce, а моя структура данных отличается.


person xmorera    schedule 07.02.2017    source источник
comment
Возможный дубликат Apache Pig: динамические столбцы   -  person Rahul Sharma    schedule 08.02.2017
comment
Спасибо @RahulSharma, но я уже пробовал и не работал. Также в нем говорится, что нужно попробовать MapReduce, а не с помощью Pig.   -  person xmorera    schedule 08.02.2017
comment
HbaseStorage может динамически добавлять столбцы, но здесь каждая ваша запись имеет идентификатор и набор кортежей, которые вызывают ошибку. В этом случае вам нужно написать свой UDF, чтобы разбить мешок PIG на отдельные кортежи, а затем попробовать.   -  person Rahul Sharma    schedule 08.02.2017


Ответы (1)


Чтобы загрузить данные в 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 - семейство столбцов.

person maxteneff    schedule 08.02.2017
comment
Большое спасибо @maxeneftt! Позвольте мне попробовать, и я вернусь, чтобы отметить это как решенное - person xmorera; 08.02.2017
comment
Спасибо @maxteneff, но это не сработало. В вашем первом решении я заменяю ячейки, поэтому вместо двух ячеек для itemid я получаю одну ячейку. По вашему второму решению я получаю три строки. - person xmorera; 08.02.2017
comment
Если вы хотите запустить эти сценарии, ваши данные должны быть точно такими, как вы определили в начале своего вопроса. Если это не так, вам следует преобразовать свои данные в PIG в формат, который я определил в начале ответа. И только после этого вы можете загрузить его в HBase. - person maxteneff; 09.02.2017
comment
В любом случае мой ответ не о конкретных сценариях, а о формате данных, которые вы должны достичь в PIG, чтобы можно было загрузить их в HBase. - person maxteneff; 09.02.2017