Java生成Parquet文件时Binary字段显示编码值无法正常处理问题
Parquet Binary字段显示Base64编码问题解决
问题根因
你定义的Parquet Schema中username字段的binary类型未指定UTF8逻辑类型注解,Parquet默认会将无注解的binary字段识别为原始字节数组,因此parquet-tools查看时会默认转为Base64格式输出。你示例中的TmFtZTE=解码后就是你实际写入的Name1,写入逻辑本身没有问题,数据没有损坏,仅为类型元信息缺失导致的识别异常。
解决方案
方案1:修改Schema(最推荐,一劳永逸)
给username字段添加UTF8逻辑类型标记,调整后的Schema如下:
message m { required INT64 id; required binary username (UTF8); required boolean active; }
重新生成Parquet文件后,执行parquet-tools cat <parquetFileName>即可直接看到明文字符串。
方案2:不修改Schema的临时查看方案
如果已有存量Parquet文件无法重新生成,可使用parquet-tools的参数指定解码规则:
# 以JSON格式输出,会自动尝试将binary字段按UTF8解码为字符串 parquet-tools cat --json <parquetFileName> # 部分版本的parquet-tools支持直接指定binary解码格式 parquet-tools cat --decode-binary utf8 <parquetFileName>
方案3:动态构建Schema时补充类型注解
如果你是在Java代码中动态构建Parquet Schema而非使用静态Schema文件,需要在构建string类型的binary字段时添加UTF8逻辑类型声明:
// 构建username字段时指定UTF8逻辑类型 Types.required(BinaryType.INSTANCE).as(LogicalTypeAnnotation.stringType()).named("username");
内容的提问来源于stack exchange,提问作者Aniket Samudra
相关产品推荐
相关产品推荐

