2017-02-07 2 views
1

J'ai besoin de charger de HBaseStorage de Pig à HBase et je n'arrive pas à comprendre comment charger avec un nombre variable de colonnes pour une famille de colonnes spécifique. nombre connu de colonnes il est facile)Ajouter un nombre variable de colonnes pour la famille de colonnes dans HBase à l'aide de Pig

des données qui ressemble à ceci: (espaces ajoutés pour readibility)

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

et je une table HBase avec RowKey et une famille colonne appelées attributs. Donc, je charge d'abord le csv en utilisant:

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

Et maintenant, je veux les regrouper par ItemId donc je fais ce qui suit:

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

C = GROUP B BY ItemId 

donc je récupérer mes données bien groupées, avec la clé, puis les tuples avec la date et le comte:

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

et ce que je visais dans HBase est d'avoir une ligne avec deux colonnes, avec la date et comptent:

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

Et c'est la partie avec laquelle je me bats, comment puis-je définir que j'ai un nombre variable de colonnes? Je l'ai essayé ce qui suit, ainsi que plusieurs autres combinaisons:

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

Mais obtenir plusieurs erreurs, par exemple celui-ci:

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

J'ai aussi essayé d'utiliser TOMAP mais ne fonctionne pas non plus. Aucune suggestion?

Remarque: la solution recommandée identifiée comme étant en double ne résout pas mon problème, elle recommande fondamentalement d'utiliser MapReduce et ma structure de données est différente.

+0

Copie possible de [Colonne Apache: Colonnes dynamiques] (http://stackoverflow.com/questions/26866697/apache-pig-dynamic-columns) –

+0

Merci @RahulSharma mais j'ai déjà essayé et cela n'a pas fonctionné. Aussi sur celui-ci il dit d'essayer MapReduce, pas vraiment le résoudre avec Pig. – xmorera

+0

HbaseStorage peut ajouter dynamiquement des colonnes mais ici, chaque enregistrement a un identifiant et un sac de tuples qui est à l'origine de l'erreur. Dans ce cas, vous devez écrire votre UDF pour exploser le sac PIG en tuples individuels, puis essayez-le. –

Répondre

1

Pour charger des données à HBase vos données dans PIG devrait être dans le format suivant:

tuple(key, map(col_qual, col_value)) 

Dans votre cas:

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

Vous pouvez créer ce type d'objet à partir de votre données initiales:

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

Ou si vous voulez atteindre après un certain regroupement par clé:

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

Et après tout ce que vous pouvez charger vos données sur le HBase:

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

mytable est votre table HBase et Attributes est votre famille de la colonne.

+0

Merci beaucoup @maxeneftt! Laissez-moi essayer et je reviendrai pour marquer ceci comme résolu – xmorera

+0

Merci @maxteneff mais cela n'a pas fonctionné. Sur votre première solution, je remplace les cellules, donc au lieu d'avoir deux cellules pour l'itemid, je reçois une seule cellule. Sur votre deuxième solution, je reçois trois lignes. – xmorera

+0

Si vous voulez exécuter ces scripts, vos données doivent être exactement celles que vous avez définies au début de votre question. Si ce n'est pas le cas, vous devez transformer vos données au format PIG au format que j'ai défini au début de la réponse. Et seulement après cela, vous pouvez le charger dans HBase. – maxteneff