1

単純なバケットでMapReduceクエリを実行します。何らかの理由で、Jacksonから例外が発生しています。

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.threetierlogic.AccountService.models.User out of START_ARRAY token
 at [Source: java.io.StringReader@39494ff0; line: 1, column: 2]
        at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
        at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)
        at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)
        ... 179 more

これが私が実行しているMapReduceクエリです:

DB.client.mapReduce(bucketName)
    .addReducePhase(NamedErlangFunction.REDUCE_IDENTITY)
    .execute().getResult(classOf[User])

これを使用してJSONを呼び出すと、getResultRaw()値を含まず、キーのみを含むJSONの文字列が返されます。

[["accounts-user","8f0bb6e41592690d701225e263807a5e"],["accounts-user","2687cf9444013c45ba2637e9f6d3d3ad"],["accounts-user","3507e2e1f3d2818fdd276214d594c8e"],["accounts-user","fd186b0293ab7eb737f8b66e353fe4a6"],["accounts-user","bf6ce6bca0f642abfe74f2e2281e676c"],["accounts-user","b58d356551a8df6d3bbaf65e577f4b12"],["accounts-user","8126d599d259fd43f701c90787096049"],["accounts-user","33b9ae3befb23b7030b609158bb762d"],["accounts-user","770a897d5ce8c8e118ae121fc01f4c80"],["accounts-user","edae605390c35256b5df055f5574734d"],["accounts-user","ef19ad34a2be4ab8de111d1590a8768b"],["accounts-user","89a9f29ac937595038d37169f9ba7c8"],["accounts-user","85be26f43f7bb74eefa7683dcc74c555"]]

それで、私はここで何を見落としていますか?ある種のドメインコンバーターを呼び出す必要がありますか、それともMapReduceクエリ自体に問題がありますか?

編集

IRiakObjectsそれが役に立ったら、Riakに保存する方法は次のとおりです。

def store(o: User) = bucket.store(o).withConverter(new UserConverter(bucketName)).execute()
4

1 に答える 1

1

コメントに記載されている最初の問題はREDUCE_IDENTITY、バケットとキーのペアのリストが返されることです。これは、必要なものではありません。2番目の問題は...JSON以外のものを保存している場合、mapreduceからPOJOに直接アクセスできないことです。3番目の(sorta)問題は...Riakmapreduceは実際にはバイナリ値用に作成されていません。

以下は、カスタムコンバーターでKryoを使用する方法を示すクックブックのKryoPersonConverterのandPersonクラスを使用しています。

コードサンプルを作成し、コメントをインライン化するために中断します。

public class App 
{
    public static void main( String[] args ) throws RiakException
    {
        List<Person> personList = new ArrayList<Person>();

        Person p = new Person("Bob","111 Elm Street","555-1212");
        personList.add(p);
        p = new Person("Jenny","122 Spruce Lane","867-5309");
        personList.add(p);
        p = new Person("Steve","333 Oak place","555-1111");
        personList.add(p);


        IRiakClient client = RiakFactory.pbcClient();
        Bucket b = client.fetchBucket("people").execute();
        KryoPersonConverter converter = new KryoPersonConverter("people");

        for (Person p2 : personList)
        {
            b.store(p2).withConverter(converter).execute();
        }

        p = new Person();
        p.setName("Jenny");
        p = b.fetch(p).withConverter(converter).execute();
        assert(p.getPhone().equals("867-5309")); // I got your number

今までのすべて?いいよ!Kryoを使用してシリアル化した後、POJOをRiakに保存し、取得しました。

        MapReduceResult result = client.mapReduce("people")
                                       .addMapPhase(NamedErlangFunction.MAP_OBJECT_VALUE)
                                       .execute();

        System.out.println(result.getResultRaw());

そして、ここで問題が発生します。その出力println()は次のとおりです。

["\u0001\u0001\u000e111 Elm Street\u0001\u0003Bob\u0001\b555-1212","\u0001\u0001\r333 Oak place\u0001\u0005Steve\u0001\b555-1111","\u0001\u0001\u000f122 Spruce Lane\u0001\u0005Jenny\u0001\b867-5309"]

残念ながら、Riakのmapreduceは、実際には、保存されたデータについて話すときにJSONデータ(または単なる文字列)で使用することを目的としています。保存したバイトのJSON文字列を含むJSON配列があります。

Stringそれを操作するには、 sをとして取得し、CollectionKryoを使用してバイトを変換する必要があります。

        Collection<String> objects = result.getResult(String.class);


        Kryo kryo = new Kryo();
        kryo.register(Person.class);
        ObjectBuffer buffer = new ObjectBuffer(kryo);

        for (String s : objects)
        {
            Person p3 = buffer.readObject(s.getBytes(), Person.class);
            System.out.println(p3.getName() + " " + p3.getPhone());
        }

        client.shutdown();     
    }
}

そして、あなたは出力を得るでしょう:

ボブ555-1212
スティーブ555-1111
ジェニー867-5309

于 2013-02-15T19:21:46.787 に答える