使用Apache Camel生成的Parquet文件无法解析,如何排查问题?
Apache Camel生成Parquet文件后无法解析的问题
我尝试用Apache Camel创建路由生成Parquet文件,代码如下:
ParquetAvroDataFormat parquet = new ParquetAvroDataFormat(); parquet.setCompressionCodecName(CompressionCodecName.UNCOMPRESSED.name()); parquet.setUnmarshalType(A.class); from(exportToParquet) .setHeader("exportParquet", simple("${header.exportBaseFolder}?charset=utf-8&noop=true&directoryMustExist=false&filename=export.parquet")) .marshal(parquet) .log("Exporting to ${header.exportParquet}") .toD("${header.exportParquet}") .log("Exported to ${header.exportParquet}"); } public static class A { public String test = "bidule"; }
调用路由后成功生成了Parquet文件,但用pqrs工具查看时出错:
> pqrs cat export.parquet #################### File: export.parquet #################### Error: ParquetError(General("Could not parse metadata: bad data"))
用VSCode的Parquet Viewer扩展加载文件时也报错:
Error: Failed to open export.parquet: Couldn't deserialize thrift: don't know what type:
请问哪里操作出错了?
问题原因及解决方法
错误使用
UnmarshalType参数:ParquetAvroDataFormat的setUnmarshalType是反序列化(读取Parquet转对象)时的配置,当前是序列化(对象转Parquet)操作,应该直接在构造方法传入要序列化的类,或通过setWriteSchema指定Schema。文件URI参数混用:你把Camel文件组件的参数(
charset=utf-8、noop=true等)直接拼在了文件路径里,导致toD解析时把这些参数当成路径的一部分,写入的文件内容出现异常。正确做法是将文件路径和组件参数分离,参数放在URI的?之后。
修正后的代码
// 序列化时直接传入目标类生成Avro Schema ParquetAvroDataFormat parquet = new ParquetAvroDataFormat(A.class); parquet.setCompressionCodecName(CompressionCodecName.UNCOMPRESSED.name()); from(exportToParquet) // 单独设置纯文件路径(目录+文件名) .setHeader("exportParquetPath", simple("${header.exportBaseFolder}/export.parquet")) .marshal(parquet) .log("Exporting to ${header.exportParquetPath}") // 文件组件参数放在URI的参数部分 .toD("file:${header.exportParquetPath}?charset=utf-8&noop=true&directoryMustExist=false") .log("Exported to ${header.exportParquetPath}"); } public static class A { public String test = "bidule"; }
额外注意事项
- 若类
A无法自动生成Avro Schema,需添加Avro相关注解(如@AvroRecord),确保Camel能正确识别类结构。 - 确认依赖完整性:需包含
camel-parquet-avro、parquet-avro、avro等依赖,版本需与Camel版本匹配。
内容的提问来源于stack exchange,提问作者Riduidel
相关产品推荐
相关产品推荐

