数组/ HashMap的Accumulo Gora Mapping

时间:2014-02-12 13:00:35

标签: avro accumulo gora

我可以使用Avro JSON规范(捆绑在Gora中)将Apache Gora作为ORM与Accumulo集成。当我使用原始数据类型(如String,Integer等)时,它工作正常。但是一旦我将数据类型定义为Array或Map,我就会遇到错误。

对于Array,当我尝试添加新元素时,Gora会抛出以下错误:

“org.apache.gora.persistency.ListGenericArray.add(Ljava /郎/对象;)Z”

使用Map,虽然我没有收到错误,但在提交后我只看到一个空的JSON对象“{}”...缺少键/值对。

这就是我的JSON规范

{
"type": "record",
"name": "Sample",
"namespace": "com.sample.goraz",
"fields": 
 [
    {"name": "first_name", "type": "string"},
    {"name":"last_name","type":"string"},
    {"name":"bucket","type":{"type":"map","values":"string"}},
    {"name":"stack","type":{"type":"array","items":"int"}}
 ]
}

这是Accumulo-Gora xml映射

<root>
<gora-orm>
    <class table="SampleCollection" keyClass="java.lang.String" name="com.sample.goraz.Sample">
        <field name="first_name" family="f" qualifier="q1" />
        <field name="last_name" family="f" qualifier="q2" />            
        <field name="bucket"  family="f" qualifier="q3" />
        <field name="stack"  family="f" qualifier="q4" />
    </class>
</gora-orm>

我正在使用Accumulo 1.5版和Gora版本0.3。我也尝试过使用Accumulo 1.4.4版但面临同样的问题。

我不确定Gora是否支持Map或Array数据类型;我想它应该将复杂的数据类型转换为等效的JSON格式,并将其存储为Accumulo中的Char序列。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

需要注意的一些事项可以解决问题 -

  • 在同一列系列下混合不同的复杂数据类型无效。这意味着每个复杂类型(如Array或Map)必须属于不同的Column Family,并在ORM xml映射中相应地定义。

  • 对于复杂数据类型,您只需指定列族而不是列限定符;那是因为Gora会创建限定符。在Array中,列限定符是索引,而Map是Key。如果你确实指定了一个列限定符,你最终会得到不稳定的数据或只是一个空集。

  • Gora编译器根据JSON输入模板创建一个Java src文件...其中字段类型'array'是作为Java GenericArray生成的;在运行时Gora抛出'AbstractMethodError'(可能是Gora中的一个bug)。我通过将Java字段数据类型更改为ListGenericArray来解决它。

最后,ORM映射文件应该如下所示::

<root>
<gora-orm>
    <class table="SampleCollection" keyClass="java.lang.String" name="com.sample.goraz.Sample">
        <field name="first_name" family="f" qualifier="q1" />
        <field name="last_name" family="f" qualifier="q2" />
        <field name="bucket"  family="g" />
        <field name="stack"  family="h"  />
    </class>
</gora-orm>

你可以在Accumulo中获得简单和复杂类型的简洁插入。