2013-03-28 5 views
1

Je vais avoir un script Pig qui se termine par le stockage de son contenu dans un fichier texte. Au cours d'un travail complètement différent, je veux lire les lignes de ce fichier et les analyser de nouveau dans Tuples. Les données dans foo peuvent contenir des charras avec des caractères utilisés lorsque vous enregistrez des Pig Bags/tuples comme {}(), etc. Je peux lire le fichier précédemment enregistré en utilisant le code like.Cochon: Reparse Strings en Tuples en Java

FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf()); 
FileStatus[] fileStatuses = fs.listStatus(new Path("outputLocation")); 

for (FileStatus fileStatus : fileStatuses) { 
    if (fileStatus.getPath().getName().contains("part")) { 
     DataInputStream in = fs.open(fileStatus.getPath());    
     String line; 
     while ((line = in.readLine()) != null) { 
      // Do stuff 
     } 
    } 
} 

Maintenant où // Do stuff est, je voudrais analyser mon String dans un tuple. Est-ce possible/Pig fournit-il une API? Le plus proche que j'ai pu trouver est la fonction textToTuple de la classe StorageUtil, mais cela fait juste un Tuple contenant un DataByteArray. Je veux un tuple contenant d'autres sacs, tuples, charrays comme à l'origine pour que je puisse facilement récupérer les champs d'origine. Je peux changer le StoreFunc Je sauve le dossier original dedans, si cela aide.

Répondre

0

Je voudrais simplement sortir les données au format JSON. Pig a un support natif pour l'analyse de JSON jusqu'à ce que tuples. Cela vous éviterait d'avoir à écrire un UDF.

1

Ceci est la solution Pig simple sans utiliser JSON ou UDF. Je l'ai trouvé à la dure.

import org.apache.pig.ResourceSchema.ResourceFieldSchema; 
import org.apache.pig.builtin.Utf8StorageConverter; 
import org.apache.pig.data.DataBag; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.newplan.logical.relational.LogicalSchema; 
import org.apache.pig.impl.util.Utils; 

Disons que votre chaîne à analyser est la suivante:

String tupleString = "(quick,123,{(brown,1.0),(fox,2.5)})"; 

Tout d'abord, analyser votre chaîne de schéma. Notez que vous avez un tuple englobant.

LogicalSchema schema = Utils.parseSchema("a0:(a1:chararray, a2:long, a3:{(a4:chararray, a5:double)})"); 

Puis analyser votre tuple avec votre schéma.

Utf8StorageConverter converter = new Utf8StorageConverter(); 
ResourceFieldSchema fieldSchema = new ResourceFieldSchema(schema.getField("a0")); 
Tuple tuple = converter.bytesToTuple(tupleString.getBytes("UTF-8"), fieldSchema); 

Voila! Vérifiez vos données.

assertEquals((String) tuple.get(0), "quick"); 
assertEquals(((DataBag) tuple.get(2)).size(), 2L);