2014-02-12 86 views
2

我可以使用Avro JSON規範(捆綁在Gora中)將Apache Gora作爲ORM與Accumulo進行集成。當我使用諸如String,Integer等原始數據類型時,它工作正常,但是一旦我將數據類型定義爲Array或Map,就會遇到錯誤。Accumulo Gora映射Array/HashMap

在陣列的情況下,戈拉當我嘗試添加新元素引發以下錯誤:「(Ljava /郎/對象;)org.apache.gora.persistency.ListGenericArray.add 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強羅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和戈拉版本0.3。我也嘗試與Accumulo版本1.4.4,但面臨同樣的問題。

我不確定Gora是否支持Map或Array數據類型;我會想象它應該將複雜的數據類型轉換爲其等效的JSON格式,並將其存儲爲Accumulo中的Char序列。

任何想法?

回答

1

幾件事情要注意哪些解決問題 -

  • 其無效同一列族下混合不同複雜的數據類型。這意味着每個複雜類型(如數組或映射)都必須屬於不同的列族,並在ORM xml映射中進行相應定義。

  • 對於複雜的數據類型,您只需指定列系列而不是列限定符;那是因爲Gora會創建Qualifier。在數組中,列限定符是索引,併爲其映射其密鑰。如果你確實指定了一個列限定符,你最終會得到不穩定的數據或只是一個空集。

  • Gora編譯器基於JSON輸入模板創建一個Java src文件...其中字段類型「數組」作爲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> 

,你會得到一個乾淨的INSERT INTO Accumulo的簡單和複雜類型。