在Spark中使用原生列函数解码二进制数据



我有一个类型为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|
// +-------------+---------------+

相关内容

  • 没有找到相关文章

最新更新