2014-02-12 7 views
2

Я могу интегрировать Apache Gora как ORM с Accumulo, используя спецификацию Avro JSON (которая входит в состав Gora). Он отлично работает, когда я использую примитивные типы данных, такие как String, Integer и т. Д., Но я сталкиваюсь с ошибками, когда я определяю тип данных как Array или Map.Accumulo Gora Mapping для Array/HashMap

В случае массива, Gora выдает следующее сообщение об ошибке при попытке добавить новый элемент:

«org.apache.gora.persistency.ListGenericArray.add (Ljava/языки/объекта;) Z»

С картой, хотя я не получаю сообщение об ошибке, все, что я вижу пустой объект 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"}} 
] 
} 

Это XML-отображение Accumulo-Гур

<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 Version 1.4.4, но столкнулся с той же проблемой.

Я не уверен, поддерживает ли Gora типы данных Map или Array; Я бы предположил, что он должен преобразовать сложные типы данных в его эквивалентный формат JSON и сохранить это как Char Sequence в Accumulo.

Любые идеи?

ответ

1

Пару вещей, чтобы отметить, какие решения этой проблемы -

  • Его недействителен смешивать различные типы сложных данных в соответствии с одной и той же семьи колонке. Это означает, что каждый сложный тип, такой как Array или Map, должен принадлежать другому семейству столбцов и определен соответствующим образом в сопоставлении xml ORM.

  • Для сложных типов данных вам нужно только указать семейство столбцов, а не классификатор столбцов; потому что Gora создаст квалификатор. В массиве классификатор столбцов является индексом и для карты является его ключ. Если вы укажете классификатор столбцов, вы получите ошибочные данные или просто пустой набор.

  • Компилятор Gora создает файл src для Java на основе шаблона ввода JSON ... внутри которого тип массива «массив» генерируется как 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 для простых и сложных типов.