我将有一个Pig脚本,最后将其内容存储在文本文件中。
STORE foo into 'outputLocation';
在完全不同的工作期间,我想读取此文件的行,并将它们解析回元组。 foo中的数据可能包含chararray,其中包含在保存Pig Bags / tuples(如{}()等时使用的字符。我可以使用类似的代码读取以前保存的文件。
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
}
}
}
现在// Do stuff
在哪里,我想把我的String解析成一个元组。这可能/ Pig是否提供API?我能找到的最接近的是StorageUtil类textToTuple函数,但这只是一个包含一个DataByteArray的元组。我想要一个包含其他包,元组,像它最初的chararray的元组,所以我可以轻松地重新获取原始字段。我可以更改StoreFunc,保存原始文件,如果有帮助的话。
答案 0 :(得分:1)
这是不使用JSON或UDF的普通Pig解决方案。我发现它很难。
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;
假设您要解析的字符串是:
String tupleString = "(quick,123,{(brown,1.0),(fox,2.5)})";
首先,解析您的架构字符串。请注意,您有一个封闭的元组。
LogicalSchema schema = Utils.parseSchema("a0:(a1:chararray, a2:long, a3:{(a4:chararray, a5:double)})");
然后使用您的架构解析您的元组。
Utf8StorageConverter converter = new Utf8StorageConverter();
ResourceFieldSchema fieldSchema = new ResourceFieldSchema(schema.getField("a0"));
Tuple tuple = converter.bytesToTuple(tupleString.getBytes("UTF-8"), fieldSchema);
瞧!检查您的数据。
assertEquals((String) tuple.get(0), "quick");
assertEquals(((DataBag) tuple.get(2)).size(), 2L);