Spark SQL将Parquet中Binary类型转为String类型失效问题排查
问题原因解析
两种场景的Binary数据本质完全不同
执行binary('AA==')时,Spark是将字符串AA==按默认字符编码(如UTF-8)转换为对应字节数组(即AA==每个字符的ASCII码),转成string时又按相同编码逆向转换,因此得到原字符串。但Parquet文件中的value字段存储的是原始二进制数据——可能是Base64解码后的字节、或其他非文本类二进制内容,和前者的字节数组完全不是同一回事。乱码与
[B@xxx标识的具体原因- 乱码:当对Parquet的Binary字段执行
cast(value as string)时,Spark会默认按UTF-8编码将字节数组解析为字符串。如果该字节数组本身并非合法的UTF-8文本字节,转换后就会出现乱码。 [B@3aad2758:直接查询value时,Spark对Binary类型的默认显示逻辑是输出Java字节数组的toString()结果——[B代表字节数组类型,@后是对象哈希值,这只是字节数组的对象标识,并非实际存储的二进制内容。
- 乱码:当对Parquet的Binary字段执行
正确处理建议
如果Parquet中的value是Base64解码后的内容,想要转回Base64字符串不要用cast,改用base64函数:select base64(value), value from sometable;如果是其他编码的文本二进制数据,需要指定对应编码进行转换:
select cast(decode(value, 'GBK') as string) from sometable;
内容的提问来源于stack exchange,提问作者apeter
相关产品推荐
相关产品推荐

