Spark中将Binary类型转换为空格分隔十六进制字符串的求助
解决方案
方法1:使用Spark内置函数实现
可以通过hex函数先将二进制数据转为连续的十六进制字符串,再通过正则表达式插入空格,最后去除末尾多余空格:
import org.apache.spark.sql.functions.{hex, regexp_replace, trim} val resultDF = res1.withColumn( "REC_HEX", trim(regexp_replace(hex($"REC"), "(..)", "$1 ")) ) // 查看结果 resultDF.show(1, false)
执行后会生成列REC_HEX,值为75 00 01 00 4C 12 10。
方法2:自定义UDF实现(更灵活)
如果需要更个性化的格式控制,可以编写UDF直接将字节数组转为目标格式:
import org.apache.spark.sql.functions.udf // 定义UDF:将字节数组转为空格分隔的两位十六进制字符串 val byteToHexUDF = udf((bytes: Array[Byte]) => bytes.map(byte => f"$byte%02X").mkString(" ") ) // 应用UDF处理列 val resultDF = res1.withColumn("REC_HEX", byteToHexUDF($"REC")) // 查看结果 resultDF.show(1, false)
为什么mkString(" ")无法得到目标格式?
直接调用Array[Byte]的mkString(" ")时,会将每个字节转换为对应的ASCII字符(比如0x75对应字符'u',0x00是不可见控制字符),而非转为十六进制字符串,因此无法得到你想要的格式。
内容的提问来源于stack exchange,提问作者Sathish Pakeer
相关产品推荐
相关产品推荐

