我可以使用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序列。
有什么想法吗?
答案 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中获得简单和复杂类型的简洁插入。