数组/哈希映射的Accumulo-Gora映射



我能够使用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中获得一个干净的插入。

最新更新