Question

Imaginez que j'ai le tableau suivant disponible pour moi:

A: { x: int, y: int, z: int, ...99 other columns... }

Je veux maintenant transformer ce, de sorte que z est réglé sur NULLx > y, avec l'ensemble de données résultant à stocker comme B.

et je veux le faire sans avoir à mentionner explicitement toutes les autres colonnes, comme cela devient un cauchemar de maintenance.

Y at-il une solution simple?

Était-ce utile?

La solution

Cette question est suivie dans ce JIRA: PIG-1693 Il doit y avoir une façon foreach pour indiquer « et tous les reste des champs "

Actuellement, je ne sais pas quoi que ce soit plus simple que de faire ce que vous dites ou non le chargement Z et l'ajout d'une nouvelle colonne Z avec le star expression .

Autres conseils

j'ai pu laisser tomber une partie de la météorisation colonne en les imbriquant dans des sacs une seule rangée et aplatir ensuite.

Pourtant, il se sent comme un peu un hack. Donc, j'enquête également en cascade pour voir si elle est un meilleur ajustement pour mon scénario.

Une fonction pour faciliter votre scénario a été ajouté dans Pig 0,9. Le nouvel opérateur projet gamme (..) vous permet d'exprimer toute une gamme de domaines en indiquant le départ et / ou à la fin des noms de champ comme dans cet exemple:

result = FOREACH someInput GÉNÉRER field1, field2, null comme field3, field4 ..;

Dans l'exemple ci-dessus field1 / 2/3/4 sont des noms de champs réels. L'un des champs est définie sur null tandis que les autres champs sont conservés.

Plus de détails dans cette "New Apache Pig 0,9 Caractéristiques - Partie 3" article: http://hortonworks.com/blog/new-apache-pig-0-9-features-part-3-additional-features/

Pour résoudre votre problème spécifique que vous voulez sans doute faire un filtre et un UNION pour combiner les résultats.

Bien sûr, vous pouvez sélectionner des colonnes par numéro de colonne, mais qui peut facilement devenir un cauchemar si vous changez quoi que ce soit. J'ai trouvé les noms de colonnes pour être beaucoup plus stable, et donc je vous recommande la solution suivante:

Mise à jour mycol quand il est entre deux colonnes connues

Vous pouvez utiliser .. pour indiquer de premier plan, ou des colonnes de fuite (ou colonnes inbetween). Voici comment cela pourrait fonctionner si vous voulez changer la valeur de « MyCol » à « updatedvalue ».

aliasAfter = FOREACH aliasBefore GENERATE 
             .. colBeforeMyCol, updatedvalue, colAfterMyCol ..;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top