You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:58:27