воскресенье, 17 марта 2013 г.


Пост 19. Сериализатор AVRO и Oracle NoSQL Database. Практика

Доброго времени суток!

Как и обещал сейчас мы рассмотрим конкретный пример AVRO сериализации в базе данных Oracle.

Итак:
1)Рассмотрим объект: человек. У него есть атрибуты имя и возраст.
Пример файла схемы данных (допустим он лежит в /home/oracle/nosql/avro/member-schemas_new.avsc)
{
    "type": "record",
    "name": "userProfile",
    "namespace": "my.example",
    "fields": [
        {"name": "name", "type": "string", "default" : ""},
        {"name": "age", "type": "int", "default": -1}
            ]
}

2)Добавьте файл схемы данных в базу данных Oracle NoSQL Database

java -jar /home/cloudera/nosql/kv-2.0.23/lib/kvstore-2.0.23.jar runadmin -port 5000 -host localhost ddl add-schema -file /home/oracle/nosql/avro/member-schemas_new.avsc
3) Напишем код, который работает со схемой данных. 

import Support.OraStore;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.sound.sampled.Port;
import oracle.kv.*;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.Schema;

import oracle.kv.avro.AvroCatalog;
import oracle.kv.avro.GenericAvroBinding;

public class a_AvroGenericBind {

    static String port = "5000";
    static String host = "localhost";
    static String store = "kvstore";
    private static Schema personSchema;
    private static GenericRecord member;
    private static String SchemaFile = "/home/oracle/nosql/avro/member-schemas_new.avsc";
    private static String SchemaName = "my.example.userProfile";
    private static KVStore myStore;
    static String UserName = "Alexey";

    public static void main(String[] args) throws IOException {
        RunExample();
    }

    public static void RunExample() throws IOException {
        OraStore orastore = new OraStore(store, host, port);
        KVStore myStore = orastore.getStore();

        final Schema.Parser parser = new Schema.Parser();
        parser.parse(new File(SchemaFile));
        personSchema = parser.getTypes().get(SchemaName);
        final AvroCatalog catalog = myStore.getAvroCatalog();
        final GenericAvroBinding binding = catalog.getGenericBinding(personSchema);
        final Key key = Key.createKey(Arrays.asList("userProfile", UserName));
        final ValueVersion valueVersion = myStore.get(key);
        final int age;
        if (valueVersion != null) {
            member = binding.toObject(valueVersion.getValue());
            System.out.println("INITIAL VALUE:\n" + member.toString());
            final int oldAge = (Integer) member.get("age");
            age = oldAge + 1;
            member.put("age", age);
            myStore.put(key, binding.toValue(member));
        } else {
            System.out.println("NO INITIAL VALUE");
            member = new GenericData.Record(personSchema);
            System.out.println(personSchema.toString());
            member.put("name", UserName);
            member.put("age", 24);
        }
        System.out.println("NEW VALUE");
        myStore.put(key, binding.toValue(member));
        System.out.println(member.toString());
        myStore.close();
    }
}

Если есть запись - идет апдейт части value, если нет - создается новая пара. Как то так.
Если кто то хочет получить виртуалку с примерами, в том числе и этим - пишите на oracle.nosql@gmail.com

Комментариев нет:

Отправить комментарий