我能够使用Avro JSON规范(捆绑在Gora中)将Apache Gora作为ORM与Accumulo集成。当我使用String、Integer等基本数据类型时,它工作得很好,但一旦我将数据类型定义为Array或Map,就会遇到错误。
在Array的情况下,当我尝试添加新元素时,Gora抛出以下错误:
"org.apache.gora.persistency.ListGenericArray.add(Ljava/lang/Object;)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序列。
有什么想法吗?
需要注意的几件事可以解决问题-
-
在同一列族下混合使用不同的复杂数据类型是无效的。这意味着每个复杂类型(如Array或Map)都必须属于不同的列族,并在ORM xml映射中相应地进行定义。
-
对于复杂的数据类型,只需要指定列族,而不需要指定列限定符;这是因为戈拉将创造资格赛。在数组中,列限定符是索引,对于映射,它是键。如果您确实指定了列限定符,那么最终会得到不稳定的数据或只是一个空集。
-
Gora编译器基于JSON输入模板创建一个Java src文件。。。其中字段类型"array"作为Java GenericArray生成;在运行时,Gora抛出一个"AbstractMethodError"(可能是Gora中的一个错误)。我通过将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中获得一个干净的插入。