完全なAvroデータのシーケンス化例

5220 ワード

1.環境準備:
Avroの公式サイトでAvroのjarファイルをダウンロードし、最新バージョン1.7.4を例に、それぞれavro-1.7.4をダウンロードした.JArとavro-tool-1.7.4.jar;JSONのjarファイルcore-aslとmapper-aslをダウンロードします.以上の4つのファイルを${HADOOP_HOME}/libディレクトリの下に入れます(現在は/usr/local/hadoop/libで、後でhadoopプロジェクトが便利になります).
2.パターンの定義(Schema):
次のように編集してファイルuserを生成します.avsc:
{
    "namespace": "example.avro",
    "type": "record",
    "name": "User",
    "fields": [
        {"name": "name", "type": "string"},
        {"name": "favorite_number", "type": ["int", "null"]},
        {"name": "favorite_color", "type": ["string", "null"]}
    ]
}

3.コンパイルモード:
現在のディレクトリで次のコマンドを実行します.
java -jar ${HADOOP_HOME}/lib/avro-tools-1.7.4.jar compile schema user.avsc .

現在のディレクトリの下にexample/avro/Userが生成されます.JAvaディレクトリとファイル.
4テストファイルの作成
以下の内容を編集する、ファイルTestを生成する.java:
/**
 * @Author wzw
 * @Date 2013.07.17
 */
import java.io.*;
import java.lang.*;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.file.DataFileReader;
import example.avro.User;
public class Test {
    public static void main(String args[]) {
        User user1 = new User();
        user1.setName("Arway");
        user1.setFavoriteNumber(3);
        user1.setFavoriteColor("green");
        User user2 = new User("Ben", 7, "red");
        //construct with builder
        User user3 = User.newBuilder().setName("Charlie").setFavoriteColor("blue").setFavoriteNumber(100).build();
        //Serialize user1, user2 and user3 to disk
            File file = new File("users.avro");
            DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
        DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
        try {
            dataFileWriter.create(user1.getSchema(), new File("users.avro"));
            dataFileWriter.append(user1);
            dataFileWriter.append(user2);
            dataFileWriter.append(user3);
            dataFileWriter.close();
        } catch (IOException e) {
        }
        //Deserialize Users from dist
        DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
        DataFileReader<User> dataFileReader = null;
        try {
            dataFileReader = new DataFileReader<User>(file, userDatumReader);
        } catch (IOException e) {
        }
        User user = null;
        try {
            while (dataFileReader.hasNext()) {
                // Reuse user object by passing it to next(). This saves
                // us from allocating and garbage collecting many objects for
                // files with many items.
                user = dataFileReader.next(user);
                System.out.println(user);
            }
        } catch (IOException e) {
        }
    }
}
5. :     , compile.sh, :
#!/usr/bin/env bash
javac -classpath /usr/local/hadoop/lib/avro-1.7.4.jar:/usr/local/hadoop/lib/avro-tools-1.7.4.jar:/usr/local/hadoop/lib/jackson-core-asl-1.9.13.jar:/usr/local/hadoop/lib/jackson-mapper-asl-1.9.13.jar example/avro/User.java Test.java
6. :     , run.sh, :
#!/usr/bin/env bash
java  -classpath /usr/local/hadoop/lib/avro-1.7.4.jar:/usr/local/hadoop/lib/avro-tools-1.7.4.jar:/usr/local/hadoop/lib/jackson-core-asl-1.9.13.jar:/usr/local/hadoop/lib/jackson-mapper-asl-1.9.13.jar:User.jar:. Test
7. : (1). :     compile.sh , example/avro/User.java Test.java , 。 (2). User :    jar cvf ./example .
(2). :     run.sh , 。 (3). avro :     Test.java for , user( 100 ) user.avro, run.sh user.plain , user.avro user.plain :
-rw-r--r-- 1 hadoop hadoop   245 2013-07-17 17:18 user.avsc
-rw-r--r-- 1 hadoop hadoop  5486 2013-07-17 18:39 User.jar
-rw-r--r-- 1 hadoop hadoop  1737 2013-07-17 19:11 users.avro
-rw-r--r-- 1 hadoop hadoop  6892 2013-07-17 19:12 users.plain

以上の出力結果からavroのシーケンス化機能を直感的に感じることができる.
参考資料:
http://avro.apache.org/docs/1.7.4/gettingstartedjava.html
http://blog.csdn.net/zhumin726/article/details/8467805
wzw0114
2013.07.17
本文は“wzw 0114の技術のブログ”のブログから出て、転載して作者と連絡してください!