2014-01-27 2 views
0

Я пытаюсь преобразовать некоторые CSV-файлы в файлы AVRO.Данные отсутствуют в файле AVRO

Код, который я написал, отлично работает во многих файлах CSV, которые я тестировал, но в некоторых файлах я обнаружил, что некоторые данные отсутствуют в файле AVRO.

Вот схема кода в преобразовании csv-> avro. Я использую 1.7.5 библиотеки C

// initialize line counter 
lineno = 0; 

// make a schema first 
avro_schema_from_json_length (...); 

// make a generic class from schema 
iface = avro_generic_class_from_schema(schema); 

// get the record size and verify that it is 109 
avro_schema_record_size (schema); 

// get a generic value 
avro_generic_value_new (iface, &tuple); 

// make me an output file 
fp = fopen (outputfile, "wb"); 

// make me a filewriter 
avro_file_writer_create_fp (fp, outputfile, 0, schema, &db); 

// now for the code to emit the data 

while (...) 
{ 
    avro_value_reset (&tuple); 

    // get the CSV record into the tuple 
    ... 

    // write that tuple 
    avro_file_writer_append_value (db, &tuple); 

    lineno ++; 

    // flush the file 
    avro_file_writer_flush (db); 
} 

// close the output file 
avro_file_writer_close (db); 

// other cleanup 
avro_value_iface_decref (iface); 
avro_value_decref (&tuple); 

// close output file 
fflush (outfp); 
fclose (outfp); 

При запуске этой программы в формате CSV файл с 448621 строками данных и одной строки заголовка, он выходит правильно с тем, что она переработанной 448621 строк данные.

Теперь читатель это модифицированный avrocat.c

Вот код.

wschema = avro_file_reader_get_writer_schema(reader); 
iface = avro_generic_class_from_schema(wschema); 
avro_generic_value_new(iface, &value); 

int rval; 
lineno = 0; 

while ((rval = avro_file_reader_read_value(reader, &value)) == 0) { 
lineno ++; 
avro_value_reset(&value); 
} 

// If it was not an EOF that caused it to fail, 
// print the error. 
if (rval != EOF) 
{ 
fprintf(stderr, "Error: %s\n", avro_strerror()); 
} 
else 
{ 
printf ("%s %lld\n", filename, lineno); 

} 

Когда я запускаю это против Avro файл я только что создал, я считаю, что он имеет только 448609 строк данных.

Не уверен, что случилось с остальными ...

Что я упускаю, делаю неправильно? Какая дополнительная информация кому-то понадобится, чтобы помочь отладить это?

Я пробовал кучу вещей.

Добавление кода флеша в файл avro является одним. Я попытался сбросить файл avroat (используя avrocat) и узнать, чего не хватает, и он имеет тенденцию быть рядами в конце.

ответ

0

Похоже, что это ошибка в c 1.7.5, которая была только что зафиксирована в c 1.7.6.

Исправлена ​​ошибка в вопросе

https://issues.apache.org/jira/browse/AVRO-1364

Решение: обновление до 1.7.6 ... где я проверил, что эта проблема не существует.

Смежные вопросы