Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pig:在Java中将字符串重新分析为元组_Java_Apache Pig - Fatal编程技术网

Pig:在Java中将字符串重新分析为元组

Pig:在Java中将字符串重新分析为元组,java,apache-pig,Java,Apache Pig,我将有一个Pig脚本,以将其内容存储在文本文件中结束 STORE foo into 'outputLocation'; 在一个完全不同的工作中,我想读取这个文件的行,并将它们解析回元组。foo中的数据可能包含字符数组,其中包含保存猪袋/元组时使用的字符,如{}(),等等。我可以使用类似的代码读取以前保存的文件 FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf()); FileStatus[] fileSta

我将有一个Pig脚本,以将其内容存储在文本文件中结束

STORE foo into 'outputLocation';
在一个完全不同的工作中,我想读取这个文件的行,并将它们解析回元组。foo中的数据可能包含字符数组,其中包含保存猪袋/元组时使用的字符,如{}(),等等。我可以使用类似的代码读取以前保存的文件

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。

我只需将数据输出为JSON格式。Pig本机支持解析JSON直到元组。这将避免您必须编写UDF。

我只需将数据输出为JSON格式。Pig本机支持解析JSON直到元组。这将避免您必须编写UDF。

这是一个不使用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);

这是不使用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);