2

我能够使用 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 格式,并将其作为 Char 序列存储在 Accumulo 中。

有任何想法吗 ?

4

1 回答 1

1

需要注意的几件事可以解决问题-

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

  • 对于复杂的数据类型,您只需要指定列族而不是列限定符;那是因为强罗会创造资格赛。在 Array 中,Column Qualifier 是 index,对于 Map,它是 Key。如果您确实指定了 Column Qualifier ,您最终会得到不稳定的数据或只是一个空集。

  • 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 中。

于 2014-02-13T06:30:23.647 回答