我正在尝试将一些CSV文件转换为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);
当我在一个包含448621行数据和一个标题行的CSV文件上运行此程序时,它正确处理了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行数据。
不确定其余的事情发生了什么......
我错过了什么,做错了什么? 有人需要哪些其他信息来帮助调试这个?
我尝试了很多东西。
将flash代码添加到avro文件中。 我试图转储avro文件(使用avrocat)并找出缺少的内容,最后它往往是行。
答案 0 :(得分:0)
这似乎是c 1.7.5中的一个错误,它在c 1.7.6中已得到修复。
有问题的错误是
解决方案:升级到1.7.6 ...我确认此问题不存在。