如何将PySpark binary类型列转为字符串,使show()输出与display()结果一致
问题原因
你调用unhex得到的是BinaryType类型的列,show()方法默认会打印二进制对象的内存标识类内容,而display(常见于Databricks等运行环境)会自动将二进制列转换为可读的十六进制字符串展示。你之前使用CAST(... AS STRING)的写法逻辑不匹配:CAST是将二进制字节按字符编码解码为自然语言字符串,并不是将二进制转为十六进制表示的字符串,因此得不到预期结果。
解决方案
方案1:在SQL中直接使用hex函数转换
将unhex后的二进制列用Spark内置的hex函数转为十六进制字符串,再调用show()即可得到和display一致的结果:
df = spark.sql("select hex(unhex('0A54C9E024AA62F9EF8BE39231782F9240B51CFB82D1CF7586F734EE07B51086')) as db_key") # 加truncate=False避免长字符串被自动截断 df.show(truncate=False)
方案2:对已生成的DataFrame使用PySpark API转换
如果你的DataFrame已经生成完成,也可以通过withColumn配合hex函数修改列类型:
from pyspark.sql.functions import hex df = df.withColumn("db_key", hex("db_key")) df.show(truncate=False)
特殊场景:如果需要解码为自然语言字符串
如果你unhex的原始十六进制串是某个字符编码的文本,需要解码为可读文本而非十六进制表示,可以使用decode函数指定编码格式,示例如下(以UTF-8编码为例):
df = spark.sql("select decode(unhex('你的十六进制文本串'), 'UTF-8') as db_key") df.show(truncate=False)
内容的提问来源于stack exchange,提问作者Sergio6Rey
相关产品推荐
相关产品推荐

