我有一个类型为binary
的列。这些值有4字节长,我想把它们解释为Int型。一个DataFrame的示例如下:
val df = Seq(
(Array(0x00.toByte, 0x00.toByte, 0x02.toByte, 0xe6.toByte))
).toDF("binary_value")
本例中的4字节可以解释为U32,从而形成数字742。使用UDF,该值可以像这样解码:
val bytesToInt = udf((x: Array[Byte]) => BigInt(x).toInt)
df.withColumn("numerical_value", bytesToInt('binary_value))
它可以工作,但代价是使用UDF和相应的序列化/反序列化开销。我希望做一些像'binary_value.cast("array<byte>")
和从那里,甚至'binary_value.cast("int")
,但Spark不允许它。
是否有一种方法来解释二进制列的另一种数据类型使用Spark本地函数?
一种方法可以转换为十六进制(使用hex
)),然后12月(使用conv
) .
conv(hex($"binary_value"), 16, 10)
df.withColumn("numerical_value", conv(hex($"binary_value"), 16, 10)).show()
// +-------------+---------------+
// | binary_value|numerical_value|
// +-------------+---------------+
// |[00 00 02 E6]| 742|
// +-------------+---------------+