2016-02-17 2 views
0

Я пытаюсь преобразовать текстовые файлы в файлы avro, используя Cascading 3.0.2 и avro-схему 2.5. Ниже приведены несколько полей из Avro схемы:Avro Scheme Write Union of Null и Double Integer Boolean

{ "type":"record", "name":"root", "namespace":"", "fields":[ 
{"name":"Key","type":"int","doc":"10,NOT NULL, Max Profiled Length=7, Max Profiled Value=1100367"}, 
{"name":"SampleCount","type":["int","null"],"doc":"10,NULL"}, 
{"name":"TestAmount","type":["double","null"] ,"doc":"20,NULL"}, 
{"name":"SampleAmount","type":["double","null"],"doc":"20,NULL"}, 
{"name":"Comments","type":["null","string"],"doc":"100,NULL"}, 
{"name":"ActiveFg","type":"boolean","doc":"5,NOT NULL"}, 
{"name":"MaxChangedDt","type":"string","doc":"20,NOT NULL,YYYY-MM-DD HH24:MI:SS,Last Record Changed Date."} 
] 
} 

Когда я пытаюсь запустить программу преобразования с помощью данной схемы я получаю следующее сообщение об ошибке:

Error for Sample 1: 
Caused by: org.apache.avro.UnresolvedUnionException: Not in union ["int","null"]: 1 
    at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:600) 
    at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:151) 
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71) 
    at org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:143) 
    at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:114) 
    at org.apache.avro.reflect.ReflectDatumWriter.writeField(ReflectDatumWriter.java:175) 
    at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104) 
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66) 
    at org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:143) 
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58) 
    at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:290) 
    ... 29 more 
Error for Sample 2: 
Caused by: org.apache.avro.UnresolvedUnionException: Not in union ["double","null"]: 46.9158 
    at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:600) 
    at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:151) 
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71) 
    at org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:143) 
    at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:114) 
    at org.apache.avro.reflect.ReflectDatumWriter.writeField(ReflectDatumWriter.java:175) 
    at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104) 
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66) 
    at org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:143) 
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58) 
    at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:290) 
    ... 29 more 

Получение аналогичной ошибки для всех двойных и межд поля типа union в файле. Если я удаляю типы объединения для Int и Double и присваиваю не нулевые значения по умолчанию в пользовательской функции Каждая функция работает нормально. Может ли кто-нибудь помочь мне в решении обработки нулей в double и integer при записи в файлы avro без необходимости присваивать значения по умолчанию. Пользователи данных не хотят, чтобы фактические значения данных были изменены от источника. Я также не хочу записывать данные как String. Союз null, строка отлично работает.

ответ

0

Не могли бы вы попробовать с обменивать «нуль» в качестве первого типа и настройки по умолчанию обнулить

"type":["null","int"], "default": null 
+0

Пробовал, что. Дает такую ​​же ошибку. Я попытался работать с отладкой, и проблема преобразования записей с каскадного объекта [] в datum с использованием Avro Wrapper не переносит перенос типа данных и пытается записать целые, двойные и логические значения в виде строки. Нулевые значения работают нормально. Я работаю над исправлением на каскадной стороне в авр-схеме. –

0

Avro 1.8.0 вводит понятие логических типов. Логические типы помогают указать масштаб и точность ввода. В вашем случае вы можете попытаться дать следующую схему:

 
{ 
    "name":"SampleCount", 
    "type":[ 
     "null", 
     "int" 
    ], 
    "logicalType":"decimal", 
    "precision":4 
} 

Попробуйте это. Ссылка для документации: here