1

我将有一个 Pig 脚本,最后将其内容存储在一个文本文件中。

STORE foo into 'outputLocation';

在一个完全不同的工作中,我想读取这个文件的行,并将它们解析回元组。foo 中的数据可能包含字符数组,其中包含保存 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,我想将我的字符串解析回元组。这可能吗/Pig 是否提供 API?我能找到的最接近的是 StorageUtil 类 textToTuple 函数,但这只会生成一个包含一个 DataByteArray 的元组。我想要一个包含其他包、元组、字符数组的元组,就像它原来的那样,这样我就可以轻松地重新获取原始字段。如果有帮助,我可以更改保存原始文件的 StoreFunc。

4

2 回答 2

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);
于 2013-11-04T10:14:27.870 回答
0

我只是将数据输出为 JSON 格式。Pig 原生支持解析 JSON,直到元组。它将避免您必须编写 UDF。

于 2013-03-28T23:13:48.487 回答