1

コンテンツをテキスト ファイルに保存して終了する Pig スクリプトを作成します。

STORE foo into 'outputLocation';

まったく別の作業中に、このファイルの行を読み取り、それらを解析してタプルに戻したいと考えています。foo のデータには、 { } ( ) などの Pig バッグ/タプルを保存するときに使用される文字を含む chararray が含まれている可能性があります。以前に保存したファイルは、次のようなコードを使用して読み取ることができます。

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 関数ですが、これは 1 つの DataByteArray を含む Tuple を作成するだけです。元のフィールドを簡単に再取得できるように、元のように他のバッグ、タプル、文字配列を含むタプルが必要です。それが役立つ場合は、元のファイルを保存する 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 に答える